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