AutoCAD/Civil 3D 学习笔记
Civil学习笔记
1.环境配置
1、添加引用:
Civil二次开发需要5个基本的AutoCAD的dll引用-acdbmgd.dll, acmgd.dll, accoremgd.dll, AecBaseMgd.dll, AeccDbMgd.dll。以后的开发的话可以根据需求来添加dll(需要下载Autodesk ObjectARX开发包,dll都在inc文件夹中)。
2、调试配置:
项目->属性->调试
启动操作->启动外部程序->选择Civil安装路径(包含acad.exe)
启动选项->命令行参数->填写如下:
/ld "C:\Program Files\AutoCAD Civil 3D 2013\AecBase.dbx"
/p "<<C3D_Imperial>>"
下面是关于AutoCAD启动命令行参数详解:
http://blog.sina.com.cn/s/blog_6848608101017v4w.html
其中,AecBase.dbx:dbx是AutoCAD数据库扩展如下图
<<C3D_Imperial>>:应该是Civil3D环境的配置信息,其中Imperial(英制)与它相对的还有Metric(公制)
命令参数填写完后选择工作目录(Working directory),我的理解是dll在哪执行,例如, C:\Program Files\AutoCAD Civil 3D 2014\UserDataCache\
这个链接是关于工作目录定义的解释
http://www.cnblogs.com/fsjohnhuang/articles/2540440.html
http://bbs.csdn.net/topics/390509308
note:Civil3D中文版的UserDataCache目录是
\Autodesk AutoCAD Civil 3D 2014\zh-CN\UserDataCache
3、加载开发的dll
打开Civil3D,在命令栏中输入NETLOAD命令,这时会弹出个文件选择框,接着选择你开发dll的路径点击确认就可以了,然后在命令栏中输入你开发的dll命令的方法名称就会执行了。
4、调试开发的dll
打开VS,设置断点按F5调试运行,因为上面调试的配置,所以Civil3D也会跟着启动。Civil3D开发后执行上面3的步骤就可以了。
2. 在.NET中使用COM API
有些功能.NET API还没有/完全实现,这时就需要用到COM API了
1、添加引用
找到Civil 3D安装目录找到下面的dll。
Autodesk.AEC.Interop.Base
Autodesk.AEC.Interop.UiBase
Autodesk.AutoCAD.Interop
Autodesk.AutoCAD.Interop.Common
Autodesk.AECC.Interop.<Civil方面的对象>
Autodesk.AECC.Interop.Ui< Civil方面的对象>
选择上面的引用后,将引用的“复制本地(Copy Local)”属性设为true
最后在项目中使用using语句引用就可以了。
注:为什么要把“复制本地”属性设为true?因为引用的这些dll在运行的时候不需要的。还有Com的dll默认情况下“复制本地”属性是不可选的。要让它可选的话,修改“嵌入互操作类型”属性为False就可以了(默认为true)。如果默认“嵌入互操作类型”的值,有可能会引发-无法嵌入互操作类型“……”的异常。解决方法就是“嵌入互操作类型”属性设为False。网上找的资料:
http://www.cnblogs.com/pnljs/archive/2012/02/20/2359313.html
3. 自定义实体
现在还没有提供.NET API自定义实体接口只能通过ObjectARX的方式来实现。ObjectARX用C++/CLI语言来开发。C++/CLI(Common Language Infrastructure)是C++在.NET平台上的扩展。C++/CLI即可以操作本地堆也可以操作托管堆。
注意:自定义实体只能做一些与实体有关的事儿,如果想执行CAD命令或与实体无关的操作请用ObjectARX C++编写然后用P/Invoke在.NET中调用。否则会出现难以预料的问题。
4. 获得/设置系统变量
AutoCAD
获得Application. GetSystemVariable(string name) ,设置Application.SetSystemVariable(string name,object val) 。或这样db.系统变量名称=值
设置AutoCAD单位
Application.DocumentManager.MdiActiveDocument.Database.Insunits=UnitsValue.Feet;
5.AutoCAD Civil3D系统设定
SettingsDrawing—图纸设定
AbbreviationsSettings---缩写设定
ObjectLayerSettings--对象图层设定
TransformationSettings--变换设定
UnitZoneSettings--单位和分带设定
AmbientSettings--环境设定
6.AutoCAD .NET API执行COM方法
如果你想在AutoCAD .NET API执行ObjectARX C++中的方法(ads_queueexpr、acedPostCommand、acedCmd)的话就需要使用P/Invoke技术了。例如
[System.Security.SuppressUnmanagedCodeSecurity]
[DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode, EntryPoint = "?acedPostCommand@@YAHPEB_W@Z")]
private static extern int acedPostCommand(string strExpr);其中DllImport函数中第一个参数是dll/exe名称,不同CAD版本的话这个名称是不一样的。反正2014用的是accore.dll,其他版是acad.exe。ps:我没有仔细验证过。有的函数需要入口点也就是EntryPoint属性,它的值可以通过dumpbin命令、Depends工具和LordPE工具来反汇编找到。下面附上完整的代码
[System.Security.SuppressUnmanagedCodeSecurity]
[DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode, EntryPoint = "?acedPostCommand@@YAHPEB_W@Z")]
private static extern int acedPostCommand(string strExpr);
public static void PostCommand(string cmdStr)
{
try { acedPostCommand(cmdStr); }
catch (System.Exception ex) { Console.WriteLine(ex.Message);
}
}
7.Jig(即时绘图)
8.放大/缩小当前视口或实体
9.过滤/查找实体
10.取消正在执行的命令(模拟ESC键)
11.在.NET中使用COM对象
var acadApp = (AcadApplication)Application.AcadApplication;var acadDoc = acadApp.ActiveDocument;var acadDB = acadDoc.Database;acadDoc.SendCommand("cmdName");
12.利用面域计算面积
13.更新当前文档视口
很简单利用Editor的UpdateScreen方法就可以了
ed.UpdateScreen();
14.引线
cad中引线在数据库中为Leader类,这里需要注意一点的是引线的坐标高度为0,具体原因后面补充。
*.坑
1、AutoCAD命令提示“未知命令**……”的原因:在Initialize方法内报出异常就会导致这种情况。O__O”…(或是少加了dll引用)
还有一种情况就是CommandClass特性位置写错了,它必须放在命名空间上面,否则在CAD 2010中就会出现“未知命令”的情况,CAD 2014没有这种情况
2、Civil 3D 工具空间(Toolspace)不见了怎么办?在命令行上输入ShowTS。
3、使用netload命令加载程序集抛出“System.BadImageFormatException”异常解决方案。
http://www.cnblogs.com/sly-tongtong/p/3569321.html
4、ObjectARX的SDK里的acdbmgd.dll、acmgd.dll与安装目录下的acdbmgd.dll、acmgd.dll这两组对应的dll是有区别的,一般调试时候用第一组,开发时候用第二组
5、.net framework版本号AutoCAD版本号是有对应关系的。比如,.net framework 3.5对应AutoCAD 2010做二次开发,如果对应错了就会出现1中描述的情况。还有调试时有可能和Visual Studio版本号有关,我就遇到过这种情况,用VS 2012+AutoCAD 2010开发时加入断点没有反应,但VS换成2010的话就有反应了。╮(╯_╰)╭
6、关于VS 2012+AutoCAD 2010开发时加入断点没有反应的问题已经解决了,原来从VS 2010开始默认的调试器类型为托管4.0,而AutoCAD是用.net framework 3.5开发的。它默认的调试器类型为托管2.0。这就造成了加入断点没有反应的情况。解决方法:
http://www.cnblogs.com/junqilian/archive/2011/03/18/1988327.html
http://www.cnblogs.com/junqilian/archive/2011/03/18/1988327.html
7、自定义实体(C++)-关于弹出“未能找到***.dll或…………”提示框的问题
引起这个问题有许多原因,我遇到的是生成选项造成的,我用的是win7 64位系统,所以安装Civil3D版本也是64位,但自定义实体项目的生成方式默认是32位,我也没改所以在netload的时候就会报出那个提示框,只要把自定义实体项目的生成方式改成64位即可。
8、在使用netload加载dll时,命令行输出一行异常的信息-“在………………”而且还没完整输出O__O”…。造成这个原因有可能是命令的名称重复
9、用Editor捕获到的东东不一定是你想要的,再操作之前一定要进行判断。比如Armadillo项目的RCheckConnectivity命令
10、不要太过于相信CAD事件,开发文档上说它不靠谱。
11、自定义AutoCAD实体出现下面错误的原因是ObjectArx安装目录改变或者不存在导致的。

解决方案:找到自定实体项目的目录下的Autodesk.arx-2014.props文件,打开并编辑ArxSdkDir节点的值,改为安装ObjectArx的路径。就OK了。
12.操蛋的弧线点
Polyline线用Explode方法打散后,子项弧线的起点和终点不一定和画线时的起终点一样,以下是测试数据:
--左到右
arc.StartPoint
{(7151.11257350689,2494.76600079297,200)}
X: 7151.1125735068927
Y: 2494.7660007929662
Z: 200.0
arc.EndPoint
{(5218.90934925515,2527.31643705483,200)}
X: 5218.9093492551474
Y: 2527.3164370548329
Z: 200.0
--下到上
arc.StartPoint
{(10482.6189523043,1834.73690787365,200)}
X: 10482.6189523043
Y: 1834.7369078736517
Z: 200.0
arc.EndPoint
{(10482.6189523043,4351.74259295576,200)}
X: 10482.6189523043
Y: 4351.7425929557648
Z: 200.0
--右到左
arc.StartPoint
{(16300.4106147591,1435.48772301059,600)}
X: 16300.410614759079
Y: 1435.4877230105917
Z: 600.0
arc.EndPoint
{(14285.8917180871,1435.48772301059,600)}
X: 14285.891718087136
Y: 1435.4877230105913
Z: 600.0
--上到下
arc.StartPoint
{(11770.9503677832,-1525.82060923224,400)}
X: 11770.950367783196
Y: -1525.8206092322357
Z: 400.0
arc.EndPoint
{(11794.1975746998,681.662180525194,400)}
X: 11794.197574699823
Y: 681.662180525194
Z: 400.0
可以看到有时候一致,有时候相反,这是非常操蛋的地方,用时谨记。
更新:貌似是起始角和终止角的问题,转的圈圈太多。
13.外部程序启动AutoCAD程序各种异常的错误
错误1-http://www.cnblogs.com/junqilian/archive/2011/08/21/2148630.html
如果按上面改正后还有错误那么原因有两个:1是ProgID值与当前CAD系统版本号不一样,2是打开多个CAD导致的
14.坑爹的SendCommand方法
用.net访问com的SendCommand并用它发送命令,如果命令行中已经有文字的话,cad会一直等待直到命令行中的文字清空或命令执行,完成前面操作后才执行我们的SendCommand方法。坑爹啊,尤其是在外部启动cad的时候,如果已经打开cad并且命令行有文字,那启动程序会一直等待造成假死现象
15.安装多款Autodesk产品注册码失败的问题
平常我们都是用AutoCAD注册机来激活Autodesk产品,但是如果操作不当就会出现激活不成功的显现。出现这种现象的原因有:1、序列号重复,即两款产品用的是同一个序列号。2、没有断网。
以上只是简单的列举了注册失败的原因。我们真正要解决的是激活失败了怎么办?有许多人卸载了再安装试了好多次都不行最后重装系统再安装才好,这样的话代价太大还浪费时间。本人亲身经历过这种情况,最后在网上找解决方法再结合实际操作找到了解决方案。下面就详细道来:
1、打开“我的电脑”进入C盘找到\ProgramData\FLEXnet文件夹,把它删除
2、卸载之前安装过的Autodesk产品(这个比较费时间,但木办法╮(╯_╰)╭)
3、清理注册表(可以用360)
4、最好重启电脑
5、开始重新安装Autodesk产品(注意序列号不能再重复了),再用注册机激活就可以了
以上本人亲自操作过没有问题。
AutoCAD/Civil 3D 学习笔记的更多相关文章
- AutoCAD Civil 3D 中缓和曲线的定义
本文对AutoCAD Civil 3D中缓和曲线的定义进行了整理. 原英文网页如下: https://knowledge.autodesk.com/support/autocad-civil-3d/l ...
- AutoCAD Civil 3D多版本插件安装包制作
程序的主要界面如下: 图1 图2 图3 图4 安装包使用Installshield 2016完成. 其中图3是重点,可以选择需要安装的版本,此功能的实现,主要是依靠Installshiel ...
- css3 3d学习笔记
几个属性: -webkit-perspective:0;景深(默认0), -webkit-perspective-origin:center center;景深基点(默认中间), -webkit-tr ...
- Unity 3D学习笔记(三)——关于脚本
在脚本中定义的类成员,如果是公共的话,在脚本与游戏对象绑定之后,是可以在Inspector中编辑的,例如下面这个脚本: using UnityEngine; using System.Collecti ...
- 《AutoCAD Civil 3D .NET二次开发》勘误2
4.6.3节中代码: 原代码: 06 pdo.Keywords.Add("Pi", "Pi", "派<Pi>"); 07 pdo ...
- 《AutoCAD Civil 3D .NET二次开发》勘误1
第十三章atc文件中Displayname应为DisplayName,注意Name的N为大写,否则参数名称无法正常显示. 给您带来的不便深表歉意!
- unity 3D 学习笔记
1.父对象的初始位置设,即刚开始的空对象的根节点位置应当设置成(0,0,0) 这样设置可以避免以后出现奇怪的坐标. GameObject实际上就是一些组件的容器. unity 使用公用变量原因是,在U ...
- stage 3d学习笔记
1. texture不能实例化,要创建一个texture对象,需要调用Context3D实例的createTexture(width:int, height:int, format:String, o ...
- Civil 3D API二次开发学习指南
Civil 3D构建于AutoCAD 和 Map 3D之上,在学习Civil 3D API二次开发之前,您至少需要了解AutoCAD API的二次开发,你可以参考AutoCAD .NET API二次开 ...
随机推荐
- EXE中释放文件
今天有个朋友问到VC能否释放多个EXE.DLL或WAV等文件,我便做了个实例给他. (注意:以下释放资源代码是不受文件扩展名所限制的,你可以释放更多类型文件) 下面是我写了个很方面的函数给大家用! 1 ...
- android 控件描边取消重叠
今天写组件的时候用到了描边.可是两个组件放在一起时,描边会变重叠,使之变粗.就不是很美观了. 如何取消呢?网上查了好久没找到,然后就自己试了试,找到了解决方法,就在此记录一下,防止以后忘记. 很简单分 ...
- jQuery 监控键盘一段时间内没输入
监控一段时间没输入可用于简单的输入完成 上次实现了一个模拟输入完成则发送请求到后台获取数据的并显示到前台的问题,其中核心的判断标准是输入完成的定义. 即:用户怎么算输入完成. 我使用的标准是,当一个文 ...
- TortoiseSVN文件夹图标不显示的解决方法
是否遇到过TortoiseSVN安装好后,发现文件夹的图标还是Windows默认的图标? 下面通过简单几步解决图标不显示的问题. 1/6 "Win + R"打开运行框,输入&quo ...
- javaSE第十二天
第十二天 64 1. Scanner的使用(了解) 64 (1)在JDK5以后出现的用于键盘录入数据的类. 64 (2)构造方法: 64 (4)要掌握的两个方法 65 ( ...
- EasyUI 后台管理系统
基础功能版: 测试地址:http://dev.blueapp.cn/index.php/2014/07/03/101/ 用户名:admin密码:123456 有问题可一起探讨,源码后期将放出 一直未测 ...
- C puzzles详解
题目:http://www.gowrikumar.com/c/ 参考:http://wangcong.org/blog/archives/291 http://www.cppblog.com/smag ...
- 日期转换(用DateTime的ParseExact方法解析特殊的日期时间)
今天遇到一个特别的需求,需要从下面的字符串中转换成一个DateTime对象: [07-13 15:50:42] 主要问题是这个时间不是标准的时间,而是自定义的格式,即开头是月-日,然后是时间. 使用最 ...
- hbase与Hadoop
Hbase是一种低延迟的在线系统,Hadoop是优化吞吐量的离线系统.这种互补关系造就了一种强大的.灵活的数据平台,可以用来搭建水平扩展的数据应用.
- 使用junit进行Spring测试
这几天在做SpringMVC的项目,现在总结一下在测试的时候碰到的一些问题. 以前做项目,是在较新的MyEclipse(2013)上面进行Maven开发,pom.xml 文件是直接复制的,做测试的时候 ...
