acedGrRead函数的定义形式为: 函数
int acedGrRead(int track,int * type,struct resbuf * result);
第一个参数:track:控制位;第二个参数:type:返回输入设备及其种类;第三个参数:result:从用户得到命令行
返回拖动的坐标:track为Bit 0(1):当用户移动鼠标或其它顶点设备时, type 设置为 5,result 设置为(X,Y)坐标。3d
返回全部的关键值:track为Bit 1(2) :包括函数和光标的全部代码。指针
控制光标的显示:Bit 2(4) :type为0,显示通常的十字丝;type为1,不显示光标或十字丝;type为2,显示选择实体的小方框。code
不显示错误:Bit 3 (8) :当用户按下 Ctrl+C 快捷键的时候,控制台暂停消息。orm
具体用法如例:对象
int track = 1, type; // 控制位和输入设备类型 struct resbuf result; // 保存鼠标拖动时的动态坐标 while (track > 0) { acedGrRead(track, &type, &result); // 追踪光标移动 ptText[X] = result.resval.rpoint[X]; // 得到用户输入点的位置 ptText[Y] = result.resval.rpoint[Y]; // 使用得到的坐标 { …… } if (type == 3) // 若是用户按下了鼠标左键,跳出循环 { track = 0; } }
用户选择一个实体,获取其属性,建立文本标注,当用户在图形窗口中移动鼠标时,修改标注文本的位置get
void ZffCHAP2AddDimension() { // 提示用户选择圆弧 ads_name en; ads_point pt; if (acedEntSel("选择所要标注的圆弧:", en, pt) != RTNORM) return; // 得到选择对象的指针 AcDbObjectId arcId; Acad::ErrorStatus es = acdbGetObjectId(arcId, en); if (es != Acad::eOk) return; AcDbEntity *pEnt = NULL; es = acdbOpenAcDbEntity(pEnt, arcId, AcDb::kForRead); // 判断选择的对象是不是圆弧 if (!pEnt->isKindOf(AcDbArc::desc())) { pEnt->close(); return; } AcDbArc *pArc = AcDbArc::cast(pEnt); // 得到圆弧的特征点位置 AcGePoint3d ptCenter, ptStart, ptEnd, ptMiddle; ptCenter = pArc->center(); es = pArc->getStartPoint(ptStart); es = pArc->getEndPoint(ptEnd); double length = 0.0; es = pArc->getDistAtPoint(ptEnd, length);//得到曲线上某一点到起点的距离 es = pArc->getPointAtDist(length / 2, ptMiddle);//距离起点必定长度的点 pEnt->close(); // 建立三点角度标注 CString strLength; strLength.Format("%.2f", length); AcDbObjectId dimId; dimId = CCreateEnt::CreateDim3PtAngular(ptCenter, ptStart,ptEnd, ptMiddle, strLength); // 拖动鼠标改变标注文字的位置 AcGePoint3d ptText; int track = 1, type; //track=1 struct resbuf result; // 保存鼠标拖动时的动态坐标 while (track > 0) { acedGrRead(track, &type, &result); // 追踪光标移动 ptText[X] = result.resval.rpoint[X]; ptText[Y] = result.resval.rpoint[Y]; // 设置拖动位置为标注文本的插入点 acdbOpenAcDbEntity(pEnt, dimId, AcDb::kForWrite); if (pEnt->isKindOf(AcDb3PointAngularDimension::desc())) { AcDb3PointAngularDimension *pDim = NULl; pDim = AcDb3PointAngularDimension::cast(pEnt); if (pDim != NULL) { pDim->setTextPosition(ptText); } } pEnt->close(); if (type == 3) // 若是用户按下了鼠标左键 { track = 0; } } }
根据用户的选择移动文字回调函数
void ZffCHAP2MoveText() { ads_name entName; ads_point ptPick, ptBase; if (acedEntSel("\n选择所要移动的文字:", entName, ptPick) != RTNORM) return; AcDbObjectId txtId; AcDbText *pText = NULL; AcDbEntity *pEnt = NULL; Acad::ErrorStatus es = acdbGetObjectId(txtId, entName); if (es != Acad::eOk) return; AcGePoint3d ptInsertOld(0, 0, 0); acdbOpenObject(pEnt, txtId, AcDb::kForWrite); if (pEnt->isKindOf(AcDbText::desc())) { pText = AcDbText::cast(pEnt); if (pText != NULL) { ptInsertOld = pText->position(); } } pEnt->close(); if (acedGetPoint(NULL, "\n选择基点:", ptBase) != RTNORM) return; acedPrompt("\n选择第二点:"); AcGePoint3d ptInsertNew(0, 0, 0); AcGePoint3d ptPick3d = asPnt3d(ptBase); // 鼠标拖动部分 int track = 1, type; //track=1 struct resbuf result; // 保存鼠标拖动时的动态坐标 while (track > 0) { acedGrRead(track, &type, &result); // 追踪光标移动 ptInsertNew[X] = result.resval.rpoint[X] - ptPick3d[X] + ptInsertOld[X]; ptInsertNew[Y] = result.resval.rpoint[Y] - ptPick3d[Y] + ptInsertOld[Y]; // 设置拖动位置为直线的终点坐标 acdbOpenObject(pEnt, txtId, AcDb::kForWrite); if (pEnt->isKindOf(AcDbText::desc())) { pText = AcDbText::cast(pEnt); if (pText != NULL) { pText->setPosition(ptInsertNew); } } pEnt->close(); if (type == 3) // 若是用户按下了鼠标左键 { track = 0; } } }
acedDragGen函数的定义形式为:it
int acedDragGen (const ads_name selectName, const ACHAR *pmt, int cursor, int (*scnf) (ads_point pt, ads_matrix mt), ads_point point)
第一个参数:selectName:选择集名称;第二个参数:pmt:命令行提示语句;第三个参数:cursor:0;第四个参数:int (*scnf) (ads_point pt, ads_matrix mt):回调函数;第五个参数:point:当前鼠标位置的点
具体用法如例:
//加到选择集 ads_name selectName,singleName; bool bIsFirst = true; for (int i = 0;i < arrAllEntId.length(); ++i) { acdbGetAdsName(singleName, arrAllEntId[i] ); if( bIsFirst ) { acedSSAdd( singleName, NULL, selectName ); bIsFirst = false; } else acedSSAdd( singleName, selectName, selectName ); acedSSFree( singleName ); } // 用户拖动肯定位置 ads_point point; while(1) { int rc = acedDragGen(selectName,_T("\n左键肯定位置:"),0,JigCallBack,point); if (rc != RTNORM) { acedSSFree(selectName); acutPrintf(_T("\n插入已取消!\n")); return FALSE; } AcGeMatrix3d matrix; AcGePoint3d ptBase(point[X], point[Y], point[Z]);//基点 matrix(2,3) = 0; // Z方向不动 AcDbObjectIdArray arrNEntId; CDrawEntityBlock mQkqly(NULL,ptBase); HHVerify(mQkqly.LockDoc()); mQkqly.CopyEntitys(arrAllEntId, matrix, arrNEntId);//从原点拷贝一份到点击点 //打成块 AcDbObjectId blockId; mQkqly.GetBlockRefrenceId(blockId); mQkqly.UnLockDoc(); if (blockId.isNull() || !blockId.isValid()) return FALSE; } acedSSFree(selectName);
回调函数:
__declspec(dllexport) int JigCallBack(ads_point pt,ads_matrix matrix) { // 肯定最终位置 AcGeVector3d vector(pt[X]-origin[X],pt[Y]-origin[Y],0); // z方向不动 AcGeMatrix3d mat = mat.setToTranslation(vector); for(int i = 0; i < 4; i++) { for(int j = 0; j < 4; j++) { matrix[i][j] = mat(i,j); } } return RTNORM; }