ObjectARX經常使用類和函數

 (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();
相關文章
相關標籤/搜索