您好,请问问题解决了么,我现在也在做这个,用的是C#,objectarx2014的我会有专门的接口,objectarx2010就没有了。
第一个问题:
acad的二次copy开发方式就是这样的,我们开发出的程序以dll的形式被动态加载到acad.exe的进程空间,再以命令驱动的方式运行。
也许你说的是打包安装文件,那个可以用installershield或setupFactory或VS中的打包msi功能。
第二个问题:
有两种方法:
一是自定义cui文件,以acad支持路径的方法在启动时加载你的cui文件。
二是通过acad提供的tlb库导出的CAcadMenuGroup\CAcadMenu等com类实时创建。
void get(int *a,int *b)
{
cout<< (*a>*b)?*a:*b<<endl//最大值
<<(*a<*b)?*a:*b<<endl//最小值版
<<(*a+*b)/2<<endl;//平均权值
}
int main()
{
int i=1;
int j=2;
get(&i,&j);
}
不需要安装,解压到一个指定位置即可。开启VC,工具->选项->路径设置-> lib inc 设置一下就可以了
objectarx2013的VS2010的嵌入插件复objectarx_wizards_2013和以前版本的OBJECTARX不同制,是
一个独立的安装包,不在ObjectARX_2013_Win_64_and_32Bit.exe文件里,需要到autodesk的网
站上下。所以objectarx2013实际上有3个文件要下,分别是:
ObjectARX_2013_Win_64_and_32Bit.exe;
ObjectARXWizards.msi;
ObjectARX_2013_Documentation.exe。
ObjectARX本身就是基于AutoCAD平台的二次开发,本质上是基于AutoCAD的Dll,共享AutoCAD的地址空间。所以,进行ObjectARX的开发,版必须要权求电脑上装有AutoCAD,而且ObjectARX生成的程序必须在AutoCAD中加载才能起作用。
创建一个ObjectARX应用程序通常包括以下几个步骤:
1、 创建实现新命令的自定义类。一般都是从ObjectARX提供的类派生出来的自定义类。
2、 决定我们的ObjectARX应用程序将处理哪一个AutoCAD消息。AutoCAD向ObjectARX应用程序发送各种消息,指出在AutoCAD内发生了特定的事件,我们决定应用程序将对哪一个消息作出响应,并触发哪一个操作。
3、 为AutoCAD提供入口。在ObjectARX2007以上的版本中有一默认的入口定义文件(AcRxDefault.def)不用用户再创建。
4、 实现初始化。在ObjectARX应用程序内,我们需要初始化已创建的任何自定义,并且重建ObjectARX运行时类树;如果要添加命令,必须注册在AutoCAD中的命令。
5、 卸载准备。卸载前必须删除所有自定义类和命令。
注册新命令的方法可以用AcEdCommandStack的addCommand的方法和acedDefun还有acedRegFunc的方法。后两咱们以后再说,主要是addCommand注册命令的方法。
AutoCAD命令是由AcEdCommandStack类定义的,按组存储在命令栈中。一般况下用addCommand函数一次添加一个命令,并用removeGroup函数成组的删除命令,也可以用removeCmd函数一次删除一个命令。作为退出前消除工作的一部分,我们应用程序需要删除它注册的所有命令。
使用ARX的向导创建一个ARX项目,增加一个命令,在命令函数中实现如下代码即可。 void ShowARCInfo() { ads_point adsPt; ads_name entName; AcDbObjectId entId; AcDbEntity* pEnt; if(acedEntSel(_T("\n请选择圆或圆弧或:"), entName, adsPt) != RTNORM) return FALSE; acdbGetObjectId(entId, entName); if (acdbOpenObject(pEnt, entId, AcDb::kForRead) != Acad::eOk) return FALSE; if(pEnt->isKindOf(AcDbArc::desc()) || pEnt->isKindOf(AcDbCircle::desc())) { AcDbArc* pArc = (AcDbArc*)pEnt; double dR = pArc->radius(); AcGePoint3d ptCen = pArc->center(); double dStartAngle = pArc->startAngle(); double dEndAngle = pArc->endAngle(); // 下面将上面的参数传递到对话框中显示即可。 ... } else { ads_printf(_T("\n所选实体并非是圆或圆弧!")); } pEnt->close(); }
使用ARX的向导创建一个ARX项目,增加一个命令,在命令函数中实现如下代码即可。
void ShowARCInfo()
{
ads_point adsPt;
ads_name entName;
AcDbObjectId entId;
AcDbEntity* pEnt;
if(acedEntSel(_T("\n请选择圆或圆弧或<退出>:"), entName, adsPt) != RTNORM)
return FALSE;
acdbGetObjectId(entId, entName);
if (acdbOpenObject(pEnt, entId, AcDb::kForRead) != Acad::eOk)
return FALSE;
if(pEnt->isKindOf(AcDbArc::desc()) || pEnt->isKindOf(AcDbCircle::desc()))
{
AcDbArc* pArc = (AcDbArc*)pEnt;
double dR = pArc->radius();
AcGePoint3d ptCen = pArc->center();
double dStartAngle = pArc->startAngle();
double dEndAngle = pArc->endAngle();
// 下面将上面的参数传递到对话框中显示即可。
...
}
else
{
ads_printf(_T("\n所选实体并非是圆或圆弧!"));
}
pEnt->close();
}
先创建一个库,然后读到库中,在保存库就行了,1.AcDbDatabase *pDbMid=new AcDbDatabase(Adesk::kFalse);2.
Acad::ErrorStatus es;
es=pDbMid->readDwgFile(FilePathName , _SH_DENYNO,false); //读取专DWG文件到数属据库中
3.pDbMid->saveAs(FilePathName);