ARX++学习笔记.docx
《ARX++学习笔记.docx》由会员分享,可在线阅读,更多相关《ARX++学习笔记.docx(15页珍藏版)》请在冰豆网上搜索。
ARX++学习笔记
/*********************************************************
//代码说明ARX二次开发学习笔记
//
//编号:
0001
//日期:
09:
232006-6-12
//QQ:
85258604
//网名:
£草下飞£
//E-MAIL:
nbxiong2002@
//BLOG:
*********************************************************/
今天上午把人民邮电的《用OBJECTARX开发》浏览了一遍,一二三章看完了,以后的会马上跟进的~~
希望一切顺利搞定哦!
朋友们和我一起努力吧!
!
/*********************************************************
//
●█〓██▄▄▄▄▄▄●●●●●●
▄▅██████▅▄▃▂
██████████████
◥⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲◤
//
*********************************************************/
/*********************************************************
//代码说明ACAD数据库学习笔记
//
//编号:
0002
//日期:
15:
232006-6-12
//QQ:
85258604
//网名:
£草下飞£
//E-MAIL:
nbxiong2002@
//BLOG:
*********************************************************/
从对ACAD数据库结构组织的学习中可以发现,当初AUTODESK工程师们做这个的时候也是花费了不少的心血的哦现不管
能不能心领神会,先表以敬意!
数据文件储存大部分数据,开发的成功取决于对数据库文件的操作熟练程度。
ObjectARX程序设计入门--1、图形数据库操作
AutoCAD图形实际上是一系列存放在一个AcDbDatabase类型的数据库中的AcDb对象。
AcDbDatabase数据库中所有的对象都有一个句柄,在一个图形(DWG)文件中,对象句柄是唯一的,用来标识对象。
AutoCAD图形实体(AcDbEntity类对象)只是AcDbDatabase数据库的一种特殊的对象,用户可以在图形窗口看到并编辑它。
AcDbDatabase数据库中的对象还有符号表、词典和其它与AcDb类对象相关的符号。
数据库中所有的图形实体和对象都可以使用ObjectARX技术,通过程序设计来进行修改和编辑。
这一点其实也就是AutoCAD二次开发的基本出发点和最终目标。
AcDbDatabase既然是数据库,它必然具备数据库的基本组织结构。
它由多个表(Table)和表中的记录(Record)构成。
AcDbDatabase数据库包括九个符号表和一个命名对象词典。
AcDbDatabase数据库使用了面向对象的数据库(OODB)技术,用传统的数据库的术语来说,它甚至不是第一范式(1NF)的,记录的组织形式与普通的数据库有较大的不同。
<这大概是很多人没把AutoCAD图形看作数据库的原因。
>
在AutoCAD命令行运行LISP函数entget可以清楚地看到实体在AcDbBlockTable块表中的记录组织形式。
当然,在ObjectARX技术中,关于数据库记录的细节进行了数据封装,对数据库的表和记录进行操作要通过访问各个类的成员函数来实现。
AcDbDatabase数据库
|------AcDb符号表
||------块表(AcDbBlockTable)
||------尺寸标注样式表(AcDbDimStyleTable)
||------层表(AcDbLayerTable)
||------线型表(AcDbLinetypeTable)
||------已注册应用程序表(AcDbRegAppTable)
||------字体样式表(AcDbTextStyleTable)
||------用户坐标系表(AcDbUCSTable)
||------视口表(AcDbViewportTable)
||------视图表(AcDbViewTable)
|-------命名对象词典
1.实体添加过程(写数据库)
AcDbDatabase*pDB=newAcDbDatabase();//获取数据库创建模拟空间
AcDbBlockTable*pDBT;//获取块表(符号表)
pDbT->getSymbolTable(pDB,AcDb:
:
kForRead);
AcDbBlockTableRecord*pDBTRec;//获取块表记录(模型空间记录)
pDBT->getAt(ACDB_MODEL_SPACE,pDBTRec,AcDb:
:
kForWrite);//设置对象属性
pDBT->close();//关闭对象空间
AcDbEntity*ent=new...;//创建新的实体(数据记录接口)
pDBTRec->appendAcDbEntity(ent);
ent->close();
pDBTRec->close();
pDB->saveas("xxx.dwg");
deletepDB;
2.数据库全局操作
acdbCurDwg();//获取当前图形数据库指针
readDwgFile(char*filename);//读入图形文件
saveAs(char*filename)//保存
acadSaveAsR13(AcDbDatabase*Rb)
acadSaveAsR14(AcDbDatabase*Rb)
insert(AcDbObjectId&blockid,constchar*pBlockName,AcDbDatabase*pDb);
setCecolor(constAcCmColor&color);
cecolor();//为数据库发挥一个颜色值
setCeltype(AcDbObjectId);//通过ID设置线形
celtype();//返回现在的线形
setLtscale(doulbe);//
ltScale();//新线型比例因子
setCeltscale(double);
celtscale();//对象缩放比例
setpsltscake(Adesk:
:
Boolean);
psltscale();
/********************************************************************
注:
以上为关于线形的设置和比例缩放的详细介绍在文章最后的备注部分
********************************************************************/
setClayer(AcDbObjectId);
clayer();//设置当前图层
3.数据库引用编辑
acdbOpenObject(T_OBJECT*&obj,AcDbObjectIdobjid,AcDb:
penModeopenmode,boolopenerase=false);
acdbGetObjectId(AcDbObjectId&objid,constads_nameobjname);
小结:
ACAD数据库模块为预留二次开发接口的时候绝大部分参考了STL模板原型和MFC类库的封装原则(或许很大程度上就是直接复制代码然后修改),比如对各种容器,递代子的使用。
数据库各种操作比较灵活,一时间不可能全部掌握,只有在熟练个过程中才能较好的驾驭
/*********************************************************
/*********************************************************
//代码说明ACAD函数库学习笔记
//
//编号:
0003
//日期:
8:
142006-6-15
//QQ:
85258604
//网名:
£草下飞£
//E-MAIL:
nbxiong2002@
//BLOG:
古代打仗有句名言,"兵马未动,粮草先行"。
掌握好经常使用的函数对于一个开发人员十分重要。
*********************************************************/
1.全局I/0函数
acutPrintf(constchar*format,...);
acedGetString(intcronly,constchar*prompt,char*result);
acedGetPoint(ads_pointpt,constchar*prompt,ads_pointresult);
acedGetInt(constchar*prompt,int*result);//获取证书输入
acedGetReal(constchar*prompt,ads_real*result);//获取实属输入
acedEntObjectId(constchar*str,ads_nameentres,ads_pointptres);
2.数据转换函数
AcGePoint3d&asPnt3d(constdouble*pnt);
3.系统函数
acdbHostApplicationServices();
acedAlert(constchar*st);
小结:
ACAD2002开发包中有220多个类,3000多个全局函数,其中有许多是常用的,也有许多是需要记忆的。
/*********************************************************
/*********************************************************
//代码说明ACAD实体学习笔记
//
//编号:
0004
//日期:
11:
062006-6-15
//QQ:
85258604
//网名:
£草下飞£
//E-MAIL:
nbxiong2002@
//BLOG:
*********************************************************/
实体是具有指定意义的一组数据结构体,抽象理解为每个特定的对象。
AcDbDatabase
|------AcDbBlockTable
||------AcDbBlockTableRecord
|||------AcDbBlockBegin
||||------AcDbEntity
||||------...
||||------AcDbBlockEnd
1.共同属性
AcCmColor//颜色
AcDbEntity:
:
setColorIndex(Adesk:
:
UInt16color);//设置颜色索引
AcDbEntity:
:
colorIndex()const;
LINESTYLE//线形
AcDbEntity:
:
setLinetype(constchar*newval);
AcDbEntity:
:
linetype()const;
AcDbEntity:
:
setLinetype(AcDbObjectIdnewval);
AcDbEntity:
:
linetypeId()const;
LINESCALE//缩放比例
AcDbEntity:
:
setLinetypeScale(doublenewval);
AcDbEntity:
:
linetypeScale()const;
VISIBLE//可视
AcDbEntity:
:
setVisiblity(AcDb:
:
Visibilitynewval);
AcDbEntity:
:
visibility()const;
LAYER//图层
AcDbEntity:
:
setLayer(constchar*newval);
AcDbEntity:
:
layer()const;
AcDbEntity:
:
setLayer(AcDbObjectIdnewobjid);
AcDbEntity:
:
layerId()const;
2.实体公共函数
intersectWidth();
transformBy();
getTransformedCopy();
getOsnapPoints();
getGripPoints();
getStretchPoints();
moveStretchPointsAt();
worldDraw();
viewPortDraw();
viewportDraw();
draw();
list();
getGeomExtents();
explode();
getSubentPathsAtGsMarker();
getGsMarkersAtSubentPath();
subentPtr();
highlight();
小结:
对于每一中实体都有其特定的属性和函数,大多情况下通过用户选择,或者通过构建遍历器来进行选定所需
要编辑操作的对象。
/*********************************************************
/*********************************************************
//代码说明ADSRX学习笔记
//
//编号:
0005
//日期:
9:
142006-6-20
//QQ:
85258604
//网名:
£草下飞£
//E-MAIL:
nbxiong2002@
//BLOG:
*********************************************************/
/*********************************************************
ADSRX主要用途:
1.获取用户输入
2.ACAD的选择集
3.DCL类型的对话框
1.使用的头文件
adslib.h
ads.h
adscodes.h
adsdlg.h
2.数据类型
typedefdoubleads_real;
typedefads_realads_point[3];
typedefads_realads_matrix[4][4];
unionads_u_val{
ads_realrreal;
ads_realrpoint[3];
shortrint;
char*rstring;
longrlname[2];
longrlong;
structads_binaryrbinary;
};
structresbuf{
structresbuf*rbnext;
shortrestype;
unionads_u_valresval;
};
acdbRToS(ads_realval,intunit,intprec,char*str);
acdAngToS(ads_realv,intunit,intprec,char*str);
acutToUpper(intc);
acutToLower(intc);
acedTrans(constads_pointpt,conststructresbuf*from,conststructresbuf*to,intdisp,ads_point
result);
3.常量定义
#defineX0
#defineY1
#defineZ3
#defineTRUE1
#defineFALSE0
#defineEOS'\0'
#definePAUSE"\\"
RTNONERTREALRTPOINTRTSHORTRTANGRTSTRRTENAMERTPICKSRTORINTRT3DPOINTRTLONGRTVOIDRTLBRTLE
RTDOTERTTRTNILRTDXF0
RTNORMRTERRORRTCANRTREJRTFAILRTKWORD
4.命令接口
acedCommand(intntype,...);
acutBuildList(intrtype,...);
acutCmd(structresbuf*rbp);
acutRelRb(structresbuf*rb);
acutNewRb(intv);
5.用户接口
acutPrompt(constchar*str);
acutPrintf(constchar*format,...);
acedAlert(constchar*str);
acedGetInt(constchar*prompt,int*result);
acedGerReal(constchar*prompt,ads_real*result);
acedGetString(intcronly,char*prompt,char*result);
acedGetDist(constads_pointpt,constchar*prompt,ads_real*result);
acedGetPoint(constads_pointpt,constchar*prompt,ads_pointresult);
acedGetCorner(constads_pointpt,constchar*prompt,ads_pointresult);
acedGetAngle(constads_pointpt,constchar*prompt,ads_real*result);
acedInitGet(intval,constchar*kwl);
acedGetInput(char*str);
acedGetKWord(constchar*prompt,char*result);
acedGetFileD(constchar*title,constchar*default,constchar*ext,intflags,structresbuf*result);
6.实体相关
acedEntSel(constchar*str,ads_nameentres,ads_pointptres);
acdbEntGet(constads_nameent);
acdbEntMod(conststructresbuf*ent);
acdbEntUpd(constads_nameent);
acdbEntLast(ads_nameresult);
7.选择集相关
acedSSGet(constchar*str,constvoid*pt1,constvoid*pt2,conststructresbuf*filter,ads_namess);
acedSSLength(constads_namesname,long*len);
acedSSAdd(constads_nameename,ads_namesname,ads_nameresult);
acedSSDel(constads_nameename,constads_namess);
acedSSName();
acedSSMemb(constads_nameename,constads_namess);
acedSSFree(constads_namesname);
acdbPointSet(from,to);
小结:
为期两个星期的ARX培训到今天已经结束了,痛苦的看了一天又一天的E文,不过还好,可以动手写程序了,呵呵手早就
痒拉~~^_^,总体说来还算对这套SDK了解一般。
呵呵,从进入VC业界,开发包总是一个接一个的用,学习也是不断的跟进,不知道什么时候才能自己施展一番天地,希
望不远吧。
这是我学习的过程写照,希望对后来的朋友们有所帮助,到这里笔记已经不打算继续写下去了,如果以后有时间的话,
可能有本人的教程出现,呵呵,期待哦^0^!
/*********************************************************
注:
关于线形
在CAD绘图时,我们都要使用各种不同的线型,如虚线、点划线、中心线等。
一些AutoCAD用户常常会发现自己明明事先设置了点划线,结果输出却为实线,究其原因,往往是由于不了解线型比例的设置引起的,问题是:
什么是线型比例?
又如何在绘图中使用线型比例?
在AutoCAD中使用各种线型绘图时,除了CONTINUOUS线型外,每一种线型都是由实线段、空白段、点、文字或形所组成的序列,在线型定义文件中已定义了这些小段的标准长度。
显示在屏幕上的每一小段长度与显示时的缩放倍数和线型比例成正比,而输出到打印机或绘图仪的每一小段长度又与输出比例和线型比例成正比。
当显示或者打印出的线型不合适时,可以通过改变线型比例系统变量的方法,来放大或缩小所有线型的每一小段的长度。
大多数的线型有三种子类,如CENTER、CENTER2、CENTERX2、DASHED、DASHED2、DASHEDX2等等,在这三种形式中,一般第一种线型是标准形式,第二种线型的比例是第一种线型的一半,第三种线型的比例是第一种线型的二倍。
如果所绘制的线条太短(非实线),以至于软件不能够画出线型所具有的点线特征,AutoCAD就会在两个端点之间画一条连续的实线。
但有时点线线型比例设置不当的话,也会使输出的线条呈实线状。
线型比例分为三种:
“全局比例因子”、“当前对象的缩放比例”和“图纸空间的线型缩放比例”。
“全局比例因子”控制所有新的和现有的线型比例因子。
“当前对象的缩放比例”控制新建对象的线型比例。
“图纸空间的线型缩放比例”作用为当“缩放时使用图纸空间单位”被选中时,AutoCAD自动调整不同图纸空间视窗中线型的缩放比例。
这三种线型比例分别由LTSCALE、CELTSCALE和PSLTSCALE三个系统变量控制。
先来看看“全局比例因子”的设置。
“全局比例因子”LTSCALE控制着所有线型的比例因子,通常值越小,每个绘图单位中画出的重复图案就越多。
在缺省情况下,AutoCAD的全局线型缩放比例为1.0,该比例等于一个绘图单位。
在“线型管理器”中“详细信息”下,可以直接输入“全局比例因子”的数值,也可以在命令行中键入ltscale命