CAD开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

ObjectARX 开发指南

实现对象对齐点函数

2022-12-31 21:10| 发布者: admin| 查看: 331| 评论: 0|来自: AutoCAD

如果希望自定义实体支持对象对齐模式,则需要覆盖函数。AutoCAD 调用以获取当前模式的相关捕捉点,而当前模式又调用以访问自定义图元的捕捉模式。如果不希望实体支持特定模式的对齐点,则可以筛选出支持的对齐模式并返回其他模式;系统会提示用户再次选择。如果多个对象捕捉模式处于活动状态,则为每个对象捕捉模式调用一次此函数。subGetOsnapPoints()getOsnapPoints()subGetOsnapPoints()eOk

注意:相交对象捕捉模式的处理方式与 不同。它使用,不使用。getOsnapPoints()AcDbEntity::intersectWith()getOsnapPoints()

下面显示了该类如何实现该函数:AsdkPolysubGetOsnapPoints()

 Acad::ErrorStatus 
 AsdkPoly::subGetOsnapPoints( 
     AcDb::OsnapMode       osnapMode, 
     Adesk::GsMarker       gsSelectionMark, 
     const AcGePoint3d&    pickPoint, 
     const AcGePoint3d&    lastPoint, 
     const AcGeMatrix3d&   viewXform, 
     AcGePoint3dArray&     snapPoints, 
     AcDbIntArray&         /*geomIds*/) const 
 { 
  
     assertReadEnabled(); 
     Acad::ErrorStatus es = Acad::eOk; 
  
     if (gsSelectionMark == 0) 
         return Acad::eOk; 
  
     if (   osnapMode != AcDb::kOsModeEnd 
         && osnapMode != AcDb::kOsModeMid 
         && osnapMode != AcDb::kOsModeNear 
         && osnapMode != AcDb::kOsModePerp 
         && osnapMode != AcDb::kOsModeCen 
         && osnapMode != AcDb::kOsModeIns) 
     { 
         return Acad::eOk; 
     } 
  
     // First, check to see if the gsSelection marker is the 
     // text geometry. If so, handle center and insertion  
     // modes, then return. No need to go into perp, mid, etc. 
     // 
     AcGePoint3d center; 
     getCenter(center); 
     if (gsSelectionMark == (mNumSides + 1)) { 
         if (osnapMode == AcDb::kOsModeIns) 
             snapPoints.append(center); 
         else if (osnapMode == AcDb::kOsModeCen) 
             snapPoints.append(center); 
          
         return es; 
     } 
  
     int startIndex = (int)(gsSelectionMark - 1); 
  
     AcGePoint3dArray vertexArray; 
     if ((es = getVertices3d(vertexArray)) != Acad::eOk) { 
         return es; 
     } 
  
     AcGeLineSeg3d lnsg(vertexArray[startIndex], 
             vertexArray[startIndex + 1]); 
     AcGePoint3d pt; 
  
     AcGeLine3d line, perpLine; 
     AcGeVector3d vec; 
  
     AcGeVector3d viewDir(viewXform(Z, 0), viewXform(Z, 1), 
             viewXform(Z, 2)); 
  
     switch (osnapMode) { 
     case AcDb::kOsModeEnd: 
         snapPoints.append(vertexArray[startIndex]); 
         snapPoints.append(vertexArray[startIndex + 1]); 
         break; 
  
     case AcDb::kOsModeMid: 
         pt.set( 
             ((vertexArray[startIndex])[X] 
                 + (vertexArray[startIndex + 1])[X]) * 0.5, 
             ((vertexArray[startIndex])[Y] 
                 + (vertexArray[startIndex + 1])[Y]) * 0.5, 
             ((vertexArray[startIndex])[Z] 
                 + (vertexArray[startIndex + 1])[Z]) * 0.5); 
         snapPoints.append(pt); 
         break; 
  
     case AcDb::kOsModeNear: 
         pt = lnsg.projClosestPointTo(pickPoint, viewDir); 
         snapPoints.append(pt); 
         break; 
  
     case AcDb::kOsModePerp: 
  
         // Create a semi-infinite line and find a point on it. 
         // 
         vec = vertexArray[startIndex + 1] 
             - vertexArray[startIndex]; 
         vec.normalize(); 
         line.set(vertexArray[startIndex], vec); 
         pt = line.closestPointTo(lastPoint); 
         snapPoints.append(pt); 
         break; 
  
     case AcDb::kOsModeCen: 
         snapPoints.append(center); 
         break; 
  
     default: 
         return Acad::eOk; 
  
     } 
     return es; 
 } 
  

路过

雷人

握手

鲜花

鸡蛋

最新评论

QQ|Archiver|CAD开发者社区 ( 苏ICP备2022047690号-1 )

GMT+8, 2024-5-19 15:25

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部