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; }