(1)AcAx 開頭的全局函數:這些函數經過 COM 的方式來讓AutoCAD 完成一些操做。數據庫
(a) acutPrintf函數:在 AutoCAD 命令行顯示指定的字符串數組
acutPrintf函數的具體用法如例:app
acutPrintf("\n輸入不合法,請從新輸入");
(b) AcAxMove 函數:移動實體。須要連接 axauto15.lib 庫函數
AcAxMove 函數的定義形式爲:測試
HRESULT AXAUTOEXP AcAxMove(AcDbObjectId& objId,VARIANT fromPoint,VARIANT toPoint);
VARIANT 是在 COM 中使用的一種特殊數據類型,由於COM是微軟用於解決組件之間數據交換的一種技術,COM 對象創建在二進制可執行代碼級的基礎上,並由此來實現多種語言開發的組件對象能夠進行交互。
所以開發 COM 所使用的數據類型是獨立於特定語言的,咱們開發 COM 客戶程序(調用 COM 對象的程序)也必須使用一些 COM 所規定的數據類型。字體
AcAxMove 函數的具體用法如例:ui
AcDbObjectId entId;//移動實體id AcGePoint3d ptFrom;//起點 AcGePoint3d ptTo;//終點 // 將AcGePoint3d類型的點座標進行類型轉換 VARIANT *pvaFrom = Point3dToVARIANT(ptFrom); VARIANT *pvaTo = Point3dToVARIANT(ptTo); BOOL bRet = SUCCEEDED(AcAxMove(entId, *pvaFrom, *pvaTo)); delete pvaFrom; delete pvaTo; static VARIANT* Point3dToVARIANT(const AcGePoint3d &point) { COleSafeArray *psa = new COleSafeArray(); DOUBLE dblValues[] = {point[X], point[Y], point[Z]}; psa->CreateOneDim(VT_R8, 3, dblValues); return (LPVARIANT)(*psa); }
(c)AcAxRotate函數:旋轉實體的操做spa
(d)AcAxScaleEntity 函數:縮放實體的操做.net
(e)全局函數 acdbOpenAcDbEntity用於從實體的 ID 號得到指向圖形數據庫中實體的指針。具體定義形式和用法參考另一篇博客。http://www.javashuo.com/article/p-xuoelied-gw.html命令行
(f)acedGetString 函數:得到用戶輸入的字符串(acedGetPoint(點)、acedGetInt、acedGetKword(關鍵字) 、acedGetDist(距離) acedGetCorner(矩形框對角點)acedGetAngle (角度)和 acedGetReal(實數))
acedGetString函數的定義形式爲:
int acedGetString(int cronly,const char * prompt,char * result);
第一個參數:cronly 指定用戶輸入的字符串中是否能夠包含空格,能夠輸入 Adesk::kTrue 或着Adesk::kFalse;
第二個參數:prompt 指定了在命令行提示用戶輸入的文本;
第三個參數:result 則保存了用戶輸入的結果(最大緩衝區爲133個字符)。
返回值:RTNORM:成功,RTERROR:失敗,RTCAN:用戶按下「ESC」鍵取消操做,RTREJ:拒絕執行操做(操做不合法),RTFAIL:與AutoLISP通訊失敗,RTKWORD:用戶輸入了關鍵字;
具體用法如例:
acedGetString(Adesk::kFalse, "\n輸入圖塊的名稱:", &blkName)
注意:第三個參數用了&,是址傳遞.
acedGetInt 函數的定義形式爲:
int acedGetInt(const char * prompt, int * result);
第一個參數:prompt: 用於指定顯示在命令窗口中的字符串,若是不須要使用能夠指定 NULL 做爲該參數的值。
第二個參數:result :用戶輸入的整數。
返回值:RTNORM:成功,RTERROR:失敗,RTCAN:用戶按下「ESC」鍵取消操做,RTREJ:拒絕執行操做(操做不合法),RTFAIL:與AutoLISP通訊失敗,RTKWORD:用戶輸入了關鍵字;
(g)acedEntSel 函數:等待用戶選擇一個實體
acedEntSel函數的定義形式爲:
int acedEntSel (const ACHAR *str, ads_name entres,ads_point ptres);
第一個參數:str:提示信息;
第二個參數:entres:實體名稱;
第三個參數:ptres:選擇實體對象時候的拾取點。
返回值:RTNORM:成功,RTERROR:失敗,RTCAN:用戶按下「ESC」鍵取消操做,RTREJ:拒絕執行操做(操做不合法),RTFAIL:與AutoLISP通訊失敗,RTKWORD:用戶輸入了關鍵字;
具體用法如例:
ads_name entres; ads_point ptres; if(RTNORM == acedEntSel(_T("\n請選擇一個實體:"),entres,ptres)) { AcDbObjectId objId; if(acdbGetObjectId(objId,entres) != Acad::eOk ) return; }
(h)acedInitGet函數:限定輸入的條件,該函數只能控制緊隨其後的一個acedGetXXX,調用後當即失效.
acedInitGet函數的定義形式爲:
int acedInitGet(int val, const ACHAR *kwl);
第一個參數:val:輸入數據的範圍和方式(1:RSG_NONULL:不容許空輸入;2:RSG_NOZERO:不容許輸入0;4:RSG_NONEG:不容許輸入負數;8:RSG_NOLIM:不檢查圖形邊界;32:RSG_DASH:用虛線表示矩形框或橡皮線;64:RSG_2D:不考慮3D的Z座標;128:RSG_OTHER:容許用戶任意輸入);
第二個參數:kwl:關鍵字列表;
具體用法如例:
int nCount = 1; acedInitGet(RSG_NONULL+RSG_NONEG+RSG_NOZERO,NULL); acedGetInt(_T("\n請輸入多邊形頂點數:"),&nCount);//不容許輸入負數和0
(i)acedSetColorDialog 函數:函數可以彈出選擇顏色對話框,而且返回用戶選擇的結果。
acedSetColorDialog 函數定義形式爲:
Adesk::Boolean acedSetColorDialog(int& nColor,Adesk::Boolean bAllowMetaColor,int nCurLayerColor);
第一個參數:nColor 參數指定了顯示【選擇顏色】對話框時的默認顏色,而且在函數返回值後保存用戶選擇的新顏色;
第二個參數:bAllowMetaColor 參數限定在【選擇顏色】對話框中是否能夠選擇「隨層」或「隨塊」;
第三個參數:nCurLayerColor 參數指定當前圖層的顏色。
(j)acedCommand 函數:
acedCommand 函數的定義形式爲:
int acedCommand(int rtype, ... unnamed);
該函數的參數個數是可變的,而且參數成對出現。參數對中第一個參數表示參數的類型,第二個表示其實際的數據。參數表的最後一個參數必須是0或者RTNONE(使用RTNONE更好一些)。
acedCommand 函數具體用法如例:
acedCommand(RTSTR, "Circle",RTSTR, 「0,0,0」, RTSTR, 「10」, RTNONE);
建立一個圓心爲(0,0)、半徑爲10的圓。
(k)acedCmd 函數:
acedCmd 函數的定義形式爲:
int acedCmd(const struct resbuf * rbp);
參數是一個 resbuf 類型的指針,這裏須要的結果緩衝區能夠由 acutBuildList 函數生成。
(l)acutNewRb 函數:建立一個新的結果緩衝區,併爲其分配存儲空間。使用該函數分配的存儲空間必須在不用的時候手工釋放空間。
(m)acutRelRb 函數:釋放結果緩衝區鏈表的存儲空間。
(n)acedGetFileD 函數:文件對話框提示用戶輸入一個文件名。
acedGetFileD 函數的定義形式爲:
int acedGetFileD(const char * title,const char * default,const char * ext,int flags,struct resbuf * result);
第一個參數:title 指定對話框的標題;
第二個參數:default 指定默認的文件名稱;
第三個參數:ext 指定默認的文件擴展名;
第四個參數:flags 參數用一個位值控制對話框的樣式;
第五個參數:result 參數包含了用戶選擇的文件名和路徑。
(o)
(p)
(2)AcDbObject 類:全部實體對應的類都間接繼承於 AcDbObject 類
clone 函數:生成一個調用者的克隆對象,並返回指向克隆對象的指針,clone 函數僅僅會生成對象的一個克隆,對於實體對象來講,這樣尚未完成複製操做的所有。還必須把它添加到模型空間中才能被顯示出來;
clone函數的定義形式爲:
virtual AcRxObject* clone() const;
cast 函數:類型轉換,實體轉爲多段線、文本、直線等。。。。。。
AcDbEntity *pEnt; AcDbPolyline *pPoly = AcDbPolyline::cast(pEnt);
isKindOf 函數:判斷是不是實體是什麼類型
if (pEnt->isKindOf(AcDbPolyline::desc()) == Adesk::kTrue) //是多段線
(3)AcDbEntity類:繼承與AcDbObject類,
(a)layer 函數:得到實體所在圖層的名字。acutDelString函數:釋放layer函數返回的字符串所佔用的內存。
具體用法如例:
char *layerName = pEnt->layer(); if (strcmp(layerName, "測試") == 0) { // 執行須要的 …… } acutDelString(layerName );
(b) layerId 函數:得到實體所在圖層的 ID。
(c) transformBy函數:對實體進行幾何變換;http://www.javashuo.com/article/p-yhefswxf-gs.html
transformBy函數的定義形式爲:
virtual Acad::ErrorStatus transformBy(const AcGeMatrix3d& xform);
具體用法如例:
AcGeMatrix3d mat; pEnt->transformBy(mat);
(d)getOsnapPoints 函數:獲得捕捉點
getOsnapPoints函數的定義形式爲:
ACDB_PORT ADESK_SEALED_VIRTUAL Acad::ErrorStatus getOsnapPoints(AcDb::OsnapMode osnapMode, Adesk::GsMarker gsSelectionMark, const AcGePoint3d& pickPoint, const AcGePoint3d& lastPoint, const AcGeMatrix3d& viewXform, AcGePoint3dArray& snapPoints, AcDbIntArray & geomIds) const;
第一個參數:osnapMode:捕捉點模式:AcDb::kOsModeEnd:找到實體上離pickPoint最近的端點;AcDb::kOsModeMid:找到實體上離pickPoint最近的中點(直線,圓弧等的中點); AcDb::kOsModeCen:圓心點;AcDb::kOsModeNode:節點;AcDb::kOsModeQuad:象限點;AcDb::kOsModeIns :插入點;AcDb::kOsModePerp:過lastPoint點的垂足;AcDb::kOsModeTan:過lastPoint點的切點;AcDb::kOsModeNear:找到離pickPoint最近的實體上的點;
第二個參數:gsSelectionMark:gs標記(若是沒有設置,就默認GS標記值0,0 爲實體自己,通常AcDbBlockReference和AcDbPolyline用到);
第三個參數:pickPoint:當前鼠標所在的點(WCS座標系);
第四個參數:lastPoint:pickPoint以前選擇的點,用來肯定垂直和切線的對象捕捉值;
第五個參數:viewXform:將WCS轉爲DCS的座標轉換矩陣;
第六個參數:snapPoints:將生成的捕捉點添加到數組中去,能夠添加0個或多個;
第七個參數:geomIds:未使用.
(e)getGripPoints 函數:獲得夾點
getGripPoints函數的定義形式爲:
Acad::ErrorStatus getGripPoints(AcGePoint3dArray& gripPoints, AcDbIntArray & osnapModes, AcDbIntArray & geomIds) const;
第一個參數:gripPoints:夾點數組
第二個參數:osnapModes:未使用
第三個參數:geomIds:未使用
Acad::ErrorStatus getGripPoints(AcDbGripDataPtrArray& grips, const double curViewUnitSize, const int gripSize, const AcGeVector3d& curViewDir, const int bitflags) const;
第一個參數:grips:夾點數組
第二個參數:curViewUnitSize:當前視圖中一個繪圖單元的大小(以像素爲單位)
第三個參數:gripSize:夾點大小,以像素爲單位
第四個參數:curViewDir:當前視圖端口中的視圖方向的向量
第五個參數:bitflags:標識
(f)meveGripPointsAt 函數:編輯夾點
moveGripPointsAt函數的定義形式爲:
Acad::ErrorStatus moveGripPointsAt(const AcDbIntArray & indices, const AcGeVector3d& offset);
第一個參數:indices:"熱的"夾點數組
第二個參數:offset:夾點平移的方向和大小
Acad::ErrorStatus moveGripPointsAt(const AcDbVoidPtrArray& gripAppData, const AcGeVector3d& offset, const int bitflags);
第一個參數:gripAppData:移動的夾點
第二個參數:offset:WCS座標系中,夾點平移的方向和大小
第三個參數:bitflags:保留供未來使用,目前爲零
(g)getSubentPathsAtGsMarker 函數:
getSubentPathsAtGsMarker函數的定義形式爲:
ACDB_PORT ADESK_SEALED_VIRTUAL Acad::ErrorStatus getSubentPathsAtGsMarker(AcDb::SubentType type, Adesk::GsMarker gsMark, const AcGePoint3d& pickPoint, const AcGeMatrix3d& viewXform, int& numPaths, AcDbFullSubentPath*& subentPaths, int numInserts = 0, AcDbObjectId* entAndInsertStack = NULL) const;
第一個參數:type:輸入子實體類型(AcDb::kFaceSubentType:面, AcDb::kEdgeSubentType:邊, AcDb::kVertexSubentType頂點, AcDb::kMlineSubentCache :線);
第二個參數:gsMark:輸入子實體的gs標識,從 ads_ssnamex()/acedSSNameX()得到;
第三個參數:pickPoint:當前鼠標所在的點(WCS座標系);
第四個參數:viewXform:輸入轉換矩陣,WCS轉DCS;
第五個參數:numPaths:輸出subentPaths數組中的AcDbFullSubentPath對象的個數;
第六個參數:subentPaths:輸出動態分配的地址數組;
第七個參數:numInserts :在entAndInsertStack中AcDbBlockReferences輸入的對象id數量,第一個是實體自己,因此少一個;
第八個參數:entAndInsertStack:
(4)AcEdCommandStack類:(命令堆棧)來添加和刪除命令
(a) addCommand 函數:用來向 AutoCAD 註冊一個外部命令
addCommand 函數的定義形式爲:
virtual Acad::ErrorStatus addCommand(const char* cmdGroupName,const char* cmdGlobalName,const char* cmdLocalName,Adesk::Int32 commandFlags,AcRxFunctionPtr FunctionAddr,AcEdUIContext * UIContext = NULL,int fcode = -1,HINSTANCE hResourceHandle = NULL,AcEdCommand** cmdPtrRet = NULL) = 0;
前面的5個參數,分別用來指定命令組名稱、命令的國際名稱、命令的本國名稱、命令的類型(模態命令或者透明命令等)和指向實現函數的指針。
addCommand 具體用法如例:
void initApp() { acedRegCmds->addCommand("Hello1","Hello", "Hello", ACRX_CMD_MODAL,HelloWorld); }
acedRegCmds 宏提供了一個指向 AcEdCommandStack 類的指針
ACRX_CMD_MODAL: 在別的命令執行的時候該命令不會在其中執行 ;ACRX_CMD_SESSION : 防止CAD自動鎖定到當前文檔 ; ACRX_CMD_TRANSPARENT: 命令能夠再其它命令中執行,但在該標誌下ads_sssetfirst()不能使用(http://blog.csdn.net/arthurfangmc/article/details/6907312) 。
(b)removeGroup 函數用來刪除已經存在的一個外部命令組,以及保存在其中的全部命令。
removeGroup函數的具體用法如例:
acedRegCmds->removeGroup("Hello1");
ACED_ARXCOMMAND_ENTRY_AUTO的具體用法如例:
ACED_ARXCOMMAND_ENTRY_AUTO(CCreateEntsApp, HHL, CreateEntsLine, CreateLine, ACRX_CMD_TRANSPARENT, NULL);
第二個參數HHL表明事件響應函數的前綴,
第三個參數是事件響應函數名稱,
第四個參數是命令名稱
在acrxEntryPoint.cpp中要實現該命令的事件響應函數 HHLCreateEntsLine:
static void HHLCreateEntsLine(void) { AcGePoint3d ptStart(0, 0, 0); AcGePoint3d ptEnd(100, 100, 0); AcDbObjectId lineId; lineId = CCreateEnt::CreateLine(ptStart, ptEnd); CModifyEnt::ChangeColor(lineId, 1); CModifyEnt::ChangeLayer(lineId, _T("虛線")); CModifyEnt::ChangeLinetype(lineId, _T("中心線")); }
這樣在AutoCAD的命令窗口輸入「CreateLine」,就會去執行HHLCreateEntsLine函數,畫一條紅色的虛直線
(5)AcDbDatabase 類:圖形數據庫
getSymbolTable 函數: 從數據庫得到符號表
getBlockTable 函數,用於得到指向圖形數據庫的塊表的指針。具體定義形式和用法參考另一篇博客http://www.javashuo.com/article/p-xuoelied-gw.html
getLayerTable 函數:從數據庫得到層表,參數以及用法參照getBlockTable。
setClayer 函數可以設置圖形的當前圖層。
(6) AcDbSymbolTable 類:全部的符號表都繼承自 AcDbSymbolTable 類
(a)add 函數:向符號表添加一條新的記錄,各類符號表實現的形式略有不一樣。
(b)getAt 函數:得到符號表中特定名稱的記錄
(c)has 函數:判斷符號表中是否包含指定的記錄,找到返回true,不然返回 false。
has 函數的具體用法如例:
// 判斷是否存在名稱爲「測試」的圖層 AcDbLayerTable *pLayerTbl; if (!pLayerTbl->has("測試")) { acutPrintf("\n當前圖形中未包含\"測試\"圖層!"); pLayerTbl->close(); return; }
(d)newIterator:建立一個符號表遍歷器,訪問符號表中的全部記錄。
newIterator 函數的具體用法如例:
AcDbBlockTableRecordIterator *pItr; pBlkTblRcd->newIterator(pItr);
(7)AcDbBlockTable 類:塊表,繼承 自AcDbSymbolTable 類,繼承了has,getAt,add,newIterator等函數,參數以及用法參照AcDbSymbolTable類。
(8)AcDbBlockTableRecord 類:
(a)appendAcDbEntity 函數:用於將 pEntity 指向的實體添加到塊表記錄和圖形數據庫中。具體定義形式和用法參考另一篇博客http://www.javashuo.com/article/p-xuoelied-gw.html
(b) hasPreviewIcon 函數:用於判斷指定的塊表記錄是否包含預覽圖標
hasPreviewIcon 函數定義爲:
Acad::ErrorStatus getPreviewIcon(PreviewIcon & previewIcon) const;
參數:PreviewIcon:在 ObjectARX 中被定義爲:typedef AcArray<Adesk::UInt8> PreviewIcon;要從該數組中得到塊定義的預覽圖標。
(c)getPreviewIcon 函數:能夠從塊表記錄中得到預覽圖標的相關數據
(9)AcDbBlockTableRecordIterator類:塊表記錄遍歷器,遍歷器在使用完畢後必定要刪除。
(a)getEntity函數:得到遍歷器的每個實體;
具體用法如例:
pItr->getEntity(pEnt, AcDb::kFrWrite);
(10)AcDbLayerTable類:層表,繼承 自AcDbSymbolTable 類,繼承了has,getAt,add,newIterator等函數,參數以及用法參照AcDbSymbolTable類。
(11)AcDbLayerTableRecord 類:
setColor 函數:設置圖層的顏色。
setLinetypeObjectId 函數:設置圖層的線型。
setLineWeight 函數:設置圖層的線寬。
(11)AcDbTextStyleTable類:文字樣式表
(12)AcDbTextStyleTableRecord 類:文字樣式表記錄
setName函數:設置名稱
setFileName函數:設置字體文件名稱
具體用法如例:
// 建立新的字體樣式表記錄 AcDbTextStyleTableRecord *pTextStyleTblRcd = NULL; pTextStyleTblRcd = new AcDbTextStyleTableRecord(); // 設置字體樣式表記錄的名稱 pTextStyleTblRcd->setName("仿宋體"); // 設置字體文件名稱 pTextStyleTblRcd->setFileName("simfang.ttf");
setFont函數:設置字體
setFont函數定義爲:
Acad::ErrorStatus setFont(const ACHAR* pTypeface, Adesk::Boolean bold, Adesk::Boolean italic, int charset, int pitchAndFamily);
第一個參數:pTypeface:字體類型;
第二個參數:bold:是否粗體;
第三個參數:italic:是否斜體;
第四個參數:charset:Windows字符集標識符;
第五個參數:pitchAndFamily:Windows間距和字符族標識符;
具體用法如例:
pTextStyleTblRcd->setFont("楷體_GB2312",0,0,134,49);
(11)AcDbLine類:直線;須要頭文件#include "dbents.h"
AcGePoint3d ptStart(0, 0, 0); AcGePoint3d ptEnd(100, 100, 0); AcDbLine *pLine = new AcDbLine(ptStart, ptEnd);(正確)//必須在堆上建立對象 AcDbLine line(ptStart, ptEnd);(不正確)//直線對象僅被在內存上建立,並無添加到圖形數據庫中,所以不可能會顯示在 圖形窗口中。
(12)AcDbPolyline類:輕量多段線;AcDb3dPolyline:三維多段線;AcDb2dPolyline:不常見
AcDb3dPolyline 構造函數定義爲:
AcDb3dPolyline *pPoly3d = new AcDb3dPolyline(AcDb::k3dSimplePoly, points);
第一個參數:AcDb::k3dSimplePoly 表示建立的多段線是一個未經擬合的標準多段線;
第二個參數值指定了建立三維多段線的頂點數組;
第三個參數指定是否閉合多段線,這裏使用了默認參數值,不在建立多段線時將其閉合。
(a)numVerts 函數:多段線的頂點數.
numVerts 函數定義爲:
unsigned int numVerts() const;
(b)getPointAt 函數:獲得頂點座標
getPointAt 函數定義爲:
Acad::ErrorStatus getPointAt( unsigned int index, AcGePoint2d& pt) const Acad::ErrorStatus getPointAt( unsigned int index, AcGePoint3d& pt) const;
具體語法如例:
AcDbPolyline polyline; for (int nIndex = 0; nIndex < polyline->numVerts(); ++nIndex) { OdGePoint3d ptTemp; polyline->getPointAt(nIndex,ptTemp); }
(c)addVertexAtget 函數,將每個頂點添加到多段線中
addVertexAt 函數定義爲:
Acad::ErrorStatus addVertexAt(unsigned int index, const AcGePoint2d& pt, double bulge = 0., double startWidth = -1., double endWidth = -1);
第一個參數:index 用來指定插入頂點的索引號(從 0 開始);
第二個參數:pt 指定頂點的位置;
第三個參數:bulge 指出要建立的頂點的凸度(0 表示直線,1 表示半圓(逆時針),-1:半圓(順時針)介於 0~1 之間爲劣弧,大
於 1 爲優弧);
第四,五個參數:startWidth 和 endWidth 指定了從該頂點到下一頂點之間連線的起始和終止線寬,利用該特性可使用多段線建立一個實心箭頭。
(d)setPointAt 函數:設置頂點座標(沒有提供AcGePoint3d)
setPointAt 函數定義爲:
Acad::ErrorStatus setPointAt(unsigned int index, const AcGePoint2d& pt);
(e)getLineSegAt 函數:獲得線段
getLineSegAt 函數定義爲:
Acad::ErrorStatus getLineSegAt(unsigned int index, AcGeLineSeg2d& ln) const;
第一個參數:index:索引,從0開始.
第二個參數:AcGeLineSeg2d:線段
(f)setClosed 函數:閉合
setClosed (Adesk::kTrue);
(13)AcDbText 類,用於 建立文字對象; AcDbMText:多行文本
構造函數定義爲:
AcDbText( const AcGePoint3d& position,const char* text,AcDbObjectId style = AcDbObjectId::kNull,double height = 0,double rotation = 0);
第一個參數:position 指定文字的插入點(文本右上角);
第二個參數:text 是將要建立的文字對象的內容;
第三個參數:style 指定要使用的文字樣式的 ID,默認狀況下使用 AutoCAD 中缺省的文字樣式;
第四個參數:height 爲文字的高度;
第五個參數rotation 爲文字的旋轉角度。
須要頭文件#include " dbmtext.h "
AcDbMText構造無參數,添加到模型空間以前用 setTextStyle() 和 setContents ()等來設置
AcDbMText *pMText = new AcDbMText(); // 設置多行文字的特性 pMText->setTextStyle(style); pMText->setContents(text); pMText->setLocation(ptInsert); pMText->setTextHeight(height); pMText->setWidth(width); pMText->setAttachment(AcDbMText::kBottomLeft); //添加到空間模型 CCreateEnt::PostToModelSpace(pMText);
(14)AcDbCircle類:圓;
AcDbCircle(); AcDbCircle(const AcGePoint3d& cntr, const AcGeVector3d& nrm, double radius);
(15)AcGeCircArc2d 類:幾何類的圓弧;須要頭文件#include "gearc3d.h"
(16)AcDbAr 類:圓弧
構造函數定義爲:
AcDbArc(const AcGePoint3d& center,double radius,double startAngle,double endAngle); AcDbArc(const AcGePoint3d& center,const AcGeVector3d& normal,double radius,double startAngle,double endAngle); AcDbArc();
(17)AcDbEllipse 類:橢圓;須要頭文件#include " dbelipse.h "
構造函數定義爲:
AcDbEllipse( const AcGePoint3d& center,const AcGeVector3d& unitNormal,const AcGeVector3d& majorAxis,double radiusRatio,double startAngle = 0.0,double endAngle = 6.28318530717958647692);
第一個參數:center: 橢圓的中心;
第二個參數:unitNormal :橢圓所在的平面;
第三個參數:majorAxis 輸入表明 1/2長軸的矢量, 也就是說該矢量的起點是橢圓的中心, 終點是橢圓長軸的一個端點;
第四個參數:radiusRatio:橢圓短軸與長軸的長度比例(爲1時,橢圓變成圓);
第五個參數:startAngle: 橢圓的起始角度(弧度) ;
第六個參數:endAngle: 橢圓的終止角度(弧度)
(17)AcDbSpline 類:樣條曲線;須要頭文件#include " dbspline.h "
構造函數定義爲:
AcDbSpline( const AcGePoint3dArray& points, int order = 4, double fitTolerance = 0.0);
第一個參數:points:樣條曲線的擬合點;
第二個參數:order:擬合曲線的階數;
第三個參數:fitTolerance:容許的擬合偏差。
AcDbSpline(const AcGePoint3dArray& points,const AcGeVector3d& startTangent,const AcGeVector3d& endTangent,int order = 4, double fitTolerance = 0.0);
第一個參數:points:樣條曲線的擬合點;
第二個參數:startTangent:樣條曲線起點切線方向;
第三個參數:endTangent:樣條曲線終點的切線方向;
第四個參數:order:擬合曲線的階數;
第五個參數:fitTolerance:容許的擬合偏差。
(18)AcDbRegion 類:面域。須要頭文件#include " dbregion.h "
(a)createFromCurves:
createFromCurves 函數的定義爲:
static Acad::ErrorStatus createFromCurves(const AcDbVoidPtrArray& curveSegments,AcDbVoidPtrArray& regions);
第一個參數:curveSegments:指向曲線實體的指針數組(定義面域的邊界,面域邊界的曲線必須首尾相連);
第二個參數:regions:指向新建立的面域的指針數組。
注:面域邊界的對象必須是 AcDbLine、 AcDbArc、 AcDbEllipse、AcDbCircle、AcDbSpline、AcDb3dPolyline 或 AcDbPolyline 類的對象。
(19)AcDb3dSolid 類:三維實體。ACIS 實體纔是實體真正的幾何表示, AcDb3dSolid 類只是 ACIS 實體的容器和接口, 該類中並無提供直接操做 ACIS實體邊、頂點和麪的方法。要遍歷 ACIS 實體中隱含(沒法直接訪問子實體)的邊、面和頂點,必須使用 ObjectARX 開發包中的 BREP 應用程序開發接口(API) 。
(a)createBox:建立長方體。一箇中心位於世界座標系原點的長方體,而且其長、寬、高分別平行於世界座標系的 X、Y 和 Z 軸。
createBox函數定義爲:
virtual Acad::ErrorStatus createBox(double xLen, double yLen, double zLen);
第一個參數:xLen:長方體的長;
第二個參數:yLen:長方體的寬;
第三個參數:zLen:長方體的高。
(b)createFrustum:建立平截頭體(圓柱體、圓錐體)。
createFrustum 函數定義爲:
virtual Acad::ErrorStatus createFrustum(double height,double xRadius,double yRadius,double topXRadius);
第一個參數:height:平截頭體的高度;
第二個參數:xRadius:底面在 X 軸方向的半徑;
第三個參數:yRadius:底面在 Y軸方向的半徑;
第四個參數:topXRadius:頂面在 X 軸方向的半徑;(圓錐時topXRadius爲0, xRadius 和 yRadius 的值相等)
(c)createSphere:建立小球。
(d)createTorus:圓環。
(e)createWedge:建立楔形
(f)extrudeAlongPath :拉伸面域建立實體。
extrudeAlongPath函數定義爲:
virtual Acad::ErrorStatus extrudeAlongPath(const AcDbRegion* region,const AcDbCurve* path);
第一個參數:region:指向拉伸截面的面域的指針;
第二個參數:path:指向拉伸路徑的曲線指針。
(g)extrude:沿面域所在平面的法線方向拉伸面域建立新的實體,而且能夠指定拉伸時的斜切角度。
(h) revolve :繞給定的軸線旋轉面域而生成實體。
revolve函數定義爲:
virtual Acad::ErrorStatus revolve(const AcDbRegion* region,const AcGePoint3d& axisPoint,const AcGeVector3d& axisDir,double angleOfRevolution);
第一個參數:region:指向旋轉截面的面域的指針;
第二個參數:axisPoint:旋轉軸線上的一點;
第三個參數:axisDir:旋轉軸的方向;
第四個參數:angleOfRevolution:旋轉面的角度;(axisPoint和axisDir共同肯定旋轉軸的具體位置)
(i)booleanOper:兩個實體之間執行布爾運算。
booleanOper函數定義爲:
virtual Acad::ErrorStatus booleanOper(AcDb::BoolOperType operation,AcDb3dSolid* solid);
第一個參數:operation:布爾運算的方式(AcDb::kBoolUnite:並集 、AcDb::kBoolIntersect:交集和 AcDb::kBoolSubtract:差集);
第二個參數:solid:指向布爾運算的另外一個實體的指針。
(20)AcDbBlockReference 類:塊參照
構造函數定義爲:
AcDbBlockReference(const AcGePoint3d& position,AcDbObjectId blockTableRec);
第一個參數:position: 塊參照的插入點;
第二個參數:blockTableRec :塊參照所參照的塊表記錄(塊定義)的 ID。
(a)rotation :旋轉角度;
AcDbObjectId blkRefId; double dAngle = 0.0; AcDbObject *pObj = NULL; acdbOpenObject(pObj,blkRefId,AcDb::kForRead); AcDbBlockReference *pBlkRef = AcDbBlockReference::cast(pObj); if (NULL != pBlkRef) { dAngle = pBlkRef->rotation(); } //若是須要0~180° dAngle = dAngle *180/3.1475926; //在轉回來 dAngle = dAngle *PI/180;
(21) AcDbAttributeDefinition 類: AcDbText 類的一個派生類, 屬性定義對象,屬性定義是 AutoCAD的一種圖形對象(對應於 AutoCAD 中的「屬性」 ) ,能夠直接建立該類的一個對象,而後將其添加到塊表記錄中。
構造函數定義爲:
AcDbAttributeDefinition(const AcGePoint3d& position,const char* text,const char* tag,const char* prompt,AcDbObjectId style = AcDbObjectId::kNull);
第一個參數:position: 屬性定義的插入點;
第二個參數:text: 屬性定義默認的顯示文字;
第三個參數:tag: 屬性定義的標記文字;
第四個參數:prompt: 屬性定義的提示文字;
第五個參數:style :文字樣式表記錄的 ID,用來指定屬性定義所使用的文字樣式。
(22)AcGeMatrix3d類:是一個幾何類,用於表示一個四維矩陣。
(a)setToTranslation:設置某個矢量爲移動基準的移動變換
(b)setToRotation:設置繞某一點旋轉必定角度的旋轉變換。
(c)setToScaling:設置以某一個基點縮放變換
(d)setToMirroring:設置以某一點進行對稱的鏡像變換。
具體語法如例:
// 構建用於實現移動實體的矩陣 AcGeVector3d vec(ptTo[X] - ptFrom[X], ptTo[Y] - ptFrom[X], ptTo[Z] - ptFrom[Z]); AcGeMatrix3d mat; mat.setToTranslation(vec);
(23)AcCmColor 類: 表明顏色對象,能夠經過顏色索引來構建一個新的顏色對象。經過顏色索引,能夠將【選擇顏色】對話框的結果設置爲指定圖層的顏色。
(a)colorIndex函數:獲得顏色的索引值。
(b)setColorIndex 函數:設置顏色的索引值。
(24)AcGePoint2dArray 類:二維點數組,成員類型爲AcGePoint2d(AcGePoint3dArray:成員AcGePoint3d)
AcGePoi d::kOrigin:世界座標系的原點;AcGeVector3d(0, 1, 0):矢量; AcGePoint3d(10, 10, 0):點。
append 函數:向數組中添加一個二維點
append函數的具體用法如例:
AcGePoint2dArray points; AcGePoint2d ptStart; AcGePoint2d ptEnd; points.append(ptStart); points.append(ptEnd);
removeAt 函數:從數組中刪除指定的元素
length 函數:數組長度
(25)AcGeCurve3d類:直線,圓,橢圓,圓弧等的幾何父類
(a)getClosestPointTo函數:求實體上離輸入點最近的點.
getClosestPointTo函數定義爲:
void getClosestPointTo(const AcGePoint3d& pnt, AcGePointOnCurve3d& pntOnCrv, const AcGeTol& tol = AcGeContext::gTol) const;
第一個參數:pnt:輸入的參考點;
第二個參數:pntOnCrv:實體上離輸入點最近的輸出點;
第三個參數:tol :公差
或
void getClosestPointTo( const AcGeCurve3d& curve3d, AcGePointOnCurve3d& pntOnThisCrv,AcGePointOnCurve3d& pntOnOtherCrv, const AcGeTol& tol = AcGeContext::gTol) const;
第一個參數:curve3d:輸入參考實體;
第二個參數:pntOnThisCrv:輸出實體上離輸入實體上最近的點;
第三個參數:pntOnOtherCrv:輸出輸入實體上離實體最近的點;
第四個參數:tol :公差
getClosestPointTo函數的具體用法如例:
OdGePoint3d startPoint,endPoint; OdGeLine3d line3d(startPoint,endPoint); OdGePointOnCurve3d tmpPt; line3d.getClosestPointTo(lastPoint,tmpPt); OdGePoint3d ptTemp=tmpPt.point();