cad中的座標系:app
(1)UCS:用戶座標系;函數
(2)WCS:世界座標系 ;3d
(3)ECS:對象座標系,多義線和細多義線對象的某些方法和屬性指定的點的值由這種座標系統表達,與對象有關;rest
(4)DCS:顯示座標系統,DCS的原點是被存在AutoCAD系統變量TARGET中的點,它的Z軸就是視圖方向。換句話說,一個視口始終是它的DCS平面圖;code
(5)PSDCS:圖紙空間DCS-該座標系統只能從當前活動的模型空間視口的DCS轉入或轉出。對象
使用 acedTrans函數在各類座標系之間轉換座標。get
acedTrans 函數的定義形式爲:it
int acedTrans(const ads_point pt,const struct resbuf * from,const struct resbuf * to,int disp,ads_point result);
第一個參數:pt: 輸入點或向量;io
第二個參數:from:當前座標系;class
第三個參數:to:目標座標系;
第四個參數:disp: 指定 pt 的類型,0爲點。非0爲向量;
第五個參數:result:座標轉換後的結果。
struct resbuf rb; if(rb.restype == RT3DPOINT)//三維擠壓向量 { //esc座標 } else if(rb.restype == RTENAME)//實體名 { //esc座標 } else if(rb.restype == RTSHORT)//整形 { if(rb.rint == 0) { //wsc } else if(rb.rint == 1) { //ucs } else if(rb.rint == 2) { //dcs } }
建立 UCS 來調整圖形的參考系。
建立 UCS:
void ZffCHAP4NewUCS() { // 得到當前圖形的UCS表 AcDbUCSTable *pUcsTbl = NULL; acdbHostApplicationServices()->workingDatabase()->getUCSTable(pUcsTbl, AcDb::kForWrite); // 定義UCS的參數 AcGePoint3d ptOrigin(0, 0, 0); AcGeVector3d vecXAxis(1, 1, 0); AcGeVector3d vecYAxis(-1, 1, 0); // 建立新的UCS表記錄 AcDbUCSTableRecord *pUcsTblRcd = new AcDbUCSTableRecord(); // 設置UCS的參數 Acad::ErrorStatus es = pUcsTblRcd->setName("NewUcs"); if (es != Acad::eOk) { delete pUcsTblRcd; pUcsTbl->close(); return; } //AcDbUCSTableRecord 類的 setOrigin、setXAxis 和setYAxis 三個函數分別用來設置原點、X 軸和 Y 軸的方向。 pUcsTblRcd->setOrigin(ptOrigin); pUcsTblRcd->setXAxis(vecXAxis); pUcsTblRcd->setYAxis(vecYAxis); // 將新建的UCS表記錄添加到UCS表中 es = pUcsTbl->add(pUcsTblRcd); if (es != Acad::eOk) { delete pUcsTblRcd; pUcsTbl->close(); return; } // 關閉對象 pUcsTblRcd->close(); pUcsTbl->close(); }
設置爲當前 UCS:
void ZffCHAP4SetCurUcs() { // 提示用戶輸入UCS的名稱 char ucsName[40]; if (acedGetString(NULL, "\n輸入用戶座標系的名稱:", ucsName) != RTNORM) return; // 得到指定的UCS表記錄 AcDbUCSTable *pUcsTbl = NULL; acdbHostApplicationServices()->workingDatabase()->getUCSTable(pUcsTbl, AcDb::kForRead); if (!pUcsTbl->has(ucsName)) { pUcsTbl->close(); return; } AcDbUCSTableRecord *pUcsTblRcd = NULL; pUcsTbl->getAt(ucsName, pUcsTblRcd, AcDb::kForRead); // 得到UCS的變換矩陣 AcGeMatrix3d mat;// UCS 到 WCS 轉換 AcGeVector3d vecXAxis, vecYAxis, vecZAxis; vecXAxis = pUcsTblRcd->xAxis(); vecYAxis = pUcsTblRcd->yAxis(); vecZAxis = vecXAxis.crossProduct(vecYAxis);//兩個矢量的向量積(根據 UCS 的 X、Y 軸方向得到 Z 方向。) mat.setCoordSystem(pUcsTblRcd->origin(), vecXAxis,vecYAxis, vecZAxis); // 關閉UCS表和UCS表記錄 pUcsTblRcd->close(); pUcsTbl->close(); // 設置當前的UCS acedSetCurrentUCS(mat); }
移動UCS 的原點:
void ZffCHAP4MoveUcsOrigin() { // 得到當前UCS的變換矩陣 AcGeMatrix3d mat; Acad::ErrorStatus es = acedGetCurrentUCS(mat); // 根據變換矩陣得到UCS的參數 AcGePoint3d ptOrigin; AcGeVector3d vecXAxis, vecYAxis, vecZAxis; mat.getCoordSystem(ptOrigin, vecXAxis, vecYAxis, vecZAxis); // 移動UCS的原點 AcGeVector3d vec(100, 100, 0); ptOrigin += vec; // 更新變換矩陣 mat.setCoordSystem(ptOrigin, vecXAxis, vecYAxis, vecZAxis); // 應用新的UCS acedSetCurrentUCS(mat); }
UCS 繞 Z 軸旋轉60°:
void ZffCHAP4RotateUcs() { // 得到當前UCS的變換矩陣 AcGeMatrix3d mat; Acad::ErrorStatus es = acedGetCurrentUCS(mat); // 根據變換矩陣得到UCS的參數 AcGePoint3d ptOrigin; AcGeVector3d vecXAxis, vecYAxis, vecZAxis; mat.getCoordSystem(ptOrigin, vecXAxis, vecYAxis, vecZAxis); // 繞Z軸旋轉60度 vecXAxis.rotateBy(60 * atan(1) * 4 / 180, vecZAxis); vecYAxis.rotateBy(60 * atan(1) * 4 / 180, vecZAxis); // 更新變換矩陣 mat.setCoordSystem(ptOrigin, vecXAxis, vecYAxis, vecZAxis); // 應用新的UCS acedSetCurrentUCS(mat); }
在UCS 中建立實體:
void ZffCHAP4AddEntInUcs() { // 轉換座標系的標記 struct resbuf wcs, ucs; wcs.restype = RTSHORT; wcs.resval.rint = 0; ucs.restype = RTSHORT; ucs.resval.rint = 1; // 提示用戶輸入直線的起點和終點 ads_point pt1, pt2; if (acedGetPoint(NULL, "拾取直線的起點:", pt1) != RTNORM) return; if (acedGetPoint(pt1, "拾取直線的終點:", pt2) != RTNORM) return; // 將起點和終點座標轉換到WCS acedTrans(pt1, &ucs, &wcs, 0, pt1); acedTrans(pt2, &ucs, &wcs, 0, pt2); // 建立直線 AcDbLine *pLine = new AcDbLine(asPnt3d(pt1), asPnt3d(pt2)); AcDbBlockTable *pBlkTbl = NULL; acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTbl, AcDb::kForRead); AcDbBlockTableRecord *pBlkTblRcd= NULL; pBlkTbl->getAt(ACDB_MODEL_SPACE, pBlkTblRcd,AcDb::kForWrite); pBlkTbl->close(); pBlkTblRcd->appendAcDbEntity(pLine); pLine->close(); pBlkTblRcd->close(); }