日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

ObjectARX常用类和函数

發(fā)布時間:2023/12/13 综合教程 29 生活家
生活随笔 收集整理的這篇文章主要介紹了 ObjectARX常用类和函数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。