找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 12941|回复: 12

[分享] ARX编程各种技术处理

[复制链接]

已领礼包: 13个

财富等级: 恭喜发财

发表于 2013-7-11 10:45:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

ARX给CAD发送命令的几种方法

ads_queueexpr( _T("(command/"_POINT/" /"1,1,0/")") );该函数CAD未公开,使用时提前声明下就可以了。可以参考帮助文件中:Tips and Techniques 。
acDocManager->sendStringToExecute(curDoc(), _T("_POINT 2,2,0/n "));该函数在Arx帮助中有详细说明。
acedCommand(RTSTR, _T("_POINT"), RTSTR,_T("5,5,0"), RTNONE);
Windows API 方法
void SendCmdToAcad(ACHAR *cmd)
{
COPYDATASTRUCT cmdMsg;
cmdMsg.dwData = (DWORD)1;
cmdMsg.cbData = (DWORD)(_tcslen(cmd) + 1) * sizeof(ACHAR);
cmdMsg.lpData = cmd;
SendMessage(adsw_acadMainWnd(), WM_COPYDATA, NULL, (LPARAM)&cmdMsg);
}
Com 方法
void SendCommandTest(void)
{  
IAcadApplicationPtr pApp = acedGetIDispatch(TRUE);
IAcadDocumentPtr pDoc;
pApp->get_ActiveDocument(&pDoc);
pDoc->SendCommand( _T("_POINT 4,4,0 ") );
}


调用自定义命令:
acDocManager->sendStringToExecute(acDocManager->curDocument(),_T("tonsel/n"),false,true);


AuToCAD启动自定义加载程序研究(转)
默认分类 2010-03-24 13:19:18 阅读121 评论0 字号:大中小

CAD文件加载顺序:       acad2006.lsp (AutoCAD使用)

       acad.rx (用户自定义的*.arx文件加载清单)

       注:在CAD2006中,由错误提示怀疑:*.arx文件检测先于acad2006.lsp加载。

       acad.lsp (用户自定义的Lsp自动加载程序)

       acad2006doc.lsp (AutoCAD使用)

      acetutil.fas (Express Tools初始化程序)

       acaddoc.lsp (用户自定义的Lsp自动加载程序)

       mymenu.mnc (用户自定义或第三方编译菜单文件)

      mymenu.mnl (用户自定义或第三方菜单文件)

      acad.mnc (AutoCAD编译菜单文件)

       acad.mnl (AutoCAD菜单文件)

     acetmain.mnc (Express Tools编译菜单文件)

      acetmain.mnl (Express Tools菜单)

      使用“对话框方式”加载的文件

      s::startup (自动执行函数,可用于自定义状态栏等)



注册表法加载顺序未知。



注意:

1.如果acad.lsp、acaddoc.lsp或MNL文件中包含自定义函数S::STARTUP,那么,创建新图形或打开现有图形时就会调用这个函数。因此,在 LISP启动文件中添加S::STARTUP函数定义,就可以执行全部所需的安装操作。如果需要关于“S::STARTUP”函数的详细信息,请参阅“AutoCAD 2000 Customization Guide”的第六章。



2.默认情况下,acad.lsp 仅在启动 AutoCAD 时加载一次,而 acaddoc.lsp 可随每个文档(或图形)一起加载。这样可使用户将加载 acad.lsp 文件和启动应用程序相关联,将 acaddoc.lsp 文件和文档或图形启动相关联。通过更改 ACADLSPASDOC 系统变量的设置,可以修改加载这些启动文件的默认方法。在CAD2006中,第一次新建图形时,也会出现对话框询问:acad.lsp是仅在启动 AutoCAD 时加载一次,还是随每个文档(或图形)一起加载。





不同位置的acad.lsp 和acaddoc.lsp按如下顺序加载:       CAD安装目录(即:acad.exe所在文件夹)

       “支持文件搜索路径”所包含的文件夹的逆序加载

      Dwg文件所在文件夹(打开Dwg文件时加载)



有关同名覆盖的问题:l         同名文件被最后加载的版本覆盖。

比如:你定义了一系列自己编制的lisp程序并放在acad.lsp文件中,但该acad.lsp放在CAD安装目录中。当“支持文件搜索路径”所包含的文件夹中,由于未知原因出现了一个与你自定义的acad.lsp文件不同的acad.lsp文件时, 你自定义的acad.lsp文件就不会被加载。解决的办法是将后加载的acad.lsp文件删除或用自己定义的acad.lsp替换放后加载的acad.lsp文件,或将自己定义的acad.lsp放在更靠后加载的目录中。



l         同名函数(或命令)被最后加载的版本覆盖。

知道AutoCAD 2000启动时各个文件加载的顺序,可能就会明白一个文件对另一个文件的影响。例如,已经在从acad.lsp文件加载的LISP程序中定义了一个函数,但是在启动AutoCAD 2000后,这个函数却不工作。这是因为acaddoc.lsp是在acad.lsp文件之后加载,此函数已经被acaddoc.lsp文件重新定义了。



l         加载的dll文件同名但dll里的函数不同名,dll不会相互覆盖。


---------------------------------------------------------------------------------------------------------------------
关于CAD启动时自动加载程序的研究(二)
1.Lisp法:a.在ACAD.EXE所在目录加入acad.lsp或acaddoc.lsp

acad.lsp或acaddoc.lsp文件内容:

(defun S::STARTUP() ;函数名不可以改变

(command "_netload" "my.dll"); my.dll为相对路径也可用绝对路径
)

或:(load “1111.lsp”)在1111.lsp文件中调用my.dll。



b.修改AutoCAD 2006/Support/acad2006.lsp或cad2006doc.lsp文件,里面加入加载代码。(加载代码同上。)



c.修改你的菜单组对应的同名的MNL文件,里面加入加载代码。

MNL文件其实是一种与菜单同名,扩展名为MNL的LISP文件。它随同名菜单加载。

acad.mnl的位置:C:/Documents and Settings/用户名/Application Data/Autodesk
/AutoCAD 2006/R16.2/chs/Support/acad.mnl

缺点:

a.可能被其他第三方程序修改时覆盖。

b.如果使用acad.lsp,新建文档时出现:“是否读入每个图形时都加载“acad.lsp”的提示。

2.对话框方式: a。菜单:工具->加载应用程序,(或用命令:_APPLOAD)
b。启动组:“内容”按钮,
c。“添加”按钮

等同于如下注册表操作:[HKEY_CURRENT_USER/Software/Autodesk/AutoCAD/R16.2/ACAD-4001:804/Profiles/<<未命名配置>>/Dialogs/Appload/Startup]

"NumStartup"="1"   //启动组加载的项目数
"1Startup"="C://Program Files//AutoCAD 2006//222.lsp"

//数字1表示在cad中加载的顺序,后面是加载文件的路径。

注意:

a.此方法在CAD2006以下版本中,只能加载lisp、VBA、arx等,不能加载dll。但可通过lisp间接加载dll。

b.此方法每次打开一个新的文档就会自动加载启动组中指定的文件。

c.(网友发言)加到启动组里面有时候不能加载,尤其是打开新图的时候。



--------------------------------------------------------------------------------------------------------------------
3.注册表法:(注意:检查LOADER的路径是否正确)

在注册表加入如下项值:

[HKEY_LOCAL_MACHINE/SOFTWARE/Autodesk/AutoCAD/R16.2/ACAD-4001:804/Applications/my]

"MANAGED"=dword:00000001

"LOADER"="C://Program Files//AutoCAD 2006//my.dll"

"LOADCTRLS"=dword:00000002

"DEION"="my"


说明:
a. 非托管的ARX程序是指用C++编译的以.arx为后缀的动态链接库文件;托管的ARX程序是指由.net程序(C#,C++.net或VB.net)编译的以.dll为后缀的动态链接库文件。托管的程序和非托管的程序相比,只要多创建一个“MANAGED”键,并设为Ox01,告诉CAD这是托管程序即可。VBA,lisp的注册表加载法参见“2. 对话框方式”。



b. 注册表键值"LOADCTRLS"控制说明,控制ARX程序的加载方式

0x01:Load the application upon detection of proxy object.
   当代理对像被控知时另载相应ARX程序.

0x02:Load the application upon AutoCAD startup.
   当AutoCAD启动时加载相应ARX程序.

0x04:Load the application upon invocation of a command.
   当输入命令时加载相应ARX程序.

0x08:Load the application upon request by the user or another application.
   当有用户或别的程序请求时加载相应ARX程序.

0x10:Do not load the application.
   从不加载该应用程序.

0x20:Load the application transparently.
   显式加载该应该程序.(不知该项译法是否有误)



c. 当my。dll中有命令时,还需要添加一个子键:

[HKEY_LOCAL_MACHINE/SOFTWARE/Autodesk/AutoCAD/R16.2/ACAD-4001:804/Applications/my/Commands]

"StartmyApp"="StartmyApp"

-StartmyApp 是你程序中一个有效的命令。



这样,你的程序就会在AutoCAD 启动时加载并初始化。你可以添加代码到程序的如下地方(VB.Net代码):

Public Sub StartmyApp()

.....

End Sub



然后在ACAD.LSP, ACAD.MNL, 或其他自动载入的文件里调用StartmyApp命令。



优点:只要项键值不同就不会被覆盖,所以建议键名使用gid。




---------------------------------------------------------------------------------------------------------------------
于CAD启动时自动加载程序的研究(四)
4.子进程法:将二次开发的程序做成EXE程序。启动该程序会自动启动CAD子进程,关闭程序时可以关闭CAD子进程。



5.ACAD.RX文件法:在AutoCAD 启动文件acad.rx 中指定待装入的ARX 应用程序名。acad.rx 是ASCII 文本文件,每个ARX 应用程序必须单独占一行,AutoCAD 启动时会自动装载该文件中的ARX 应用程序。另外,应确保$ACAD 路径定义中包括文件acad.rx 的存放目录。



6.配置文件法:可以把自己配置的AUTOCAD启动时加载的东西,保存成一个的配置文件。然后在AUTOCAD启动快捷方式中用参数: /p 你的配置文件名。这样就可以在启动的时候加载自己的CAD环境。


具体如下:菜单:工具--选项(或用命令:_OPTIONS),“配置”选项卡,选择配置文件后,点击“输出”。可以输出一个扩展名为arg的文本文件,保存到某个位置,然后再桌面上将cad 的快捷方式复制一个,右键属性,将目标中"C://My Programs//Auto CAD//acad.exe"的后面加上/p "d:/test/test.arg" (注意:双引号,不是汉字的,而是英文的!)


有些命令要求:将加载的文件的路径,加入搜索路径。方法如下:

加入搜索路径:菜单:工具->选项,(或用命令:_OPTIONS)
选中“支持文件搜索路径”,点“添加”,点“浏览”,选择要添加的路径,点“确定”。



等同于如下注册表操作:注意需要先关闭CAD

[HKEY_CURRENT_USER/Software/Autodesk/AutoCAD/R16.2/ACAD-4001:804/Profiles/<<未命名配置>>/General]

"ACAD"="C://Documents and Settings//用户名//Application Data//Autodesk//AutoCAD 2006//R16.2//chs//support;C://Program Files//AutoCAD 2006//support;C://Program Files//AutoCAD 2006//fonts;C://Program Files//AutoCAD 2006//help;C://Program Files//AutoCAD 2006//Express;C://Program Files//AutoCAD 2006//support//color;C://Program Files//AutoCAD 2006//myfile;"

注意:此法每次打开一个新的文档就会自动加载注册表中指定的文件。

--------------------------------------------------------------------------------------------------------------------
关于CAD启动时自动加载程序的研究(五)
附:      CAD加载命令:appload (加载VBA,Arx,Lisp), netload(加载dll),arxload(加载Arx),load(加载Lisp),autoload(加载Lisp),autoarxload(加载Arx)

       加载二次开发线程的方法:loadDVB(加载VBA的方法)和loadARX(加载ARX的方法)

      用acrxLoadModule() 或AcRxDynamicLinker::loadModule() 函数,在一个ARX 应用程序里装载另一个ARX 应用程序。这两个函数的原型是:

---- int acrxLoadModule(char * moduleName, int printit);

---- virtual Adesk::Boolean AcRxDynamicLinker::loadModule (char * fileName, int printIt) = 0;

---- 其中各参数含义如下:

---- moduleName:待装载的ARX 应用程序名;ARX 应用程序扩展名默认为.ARX,如果不是.ARX,则此处char * moduleName 参数必须包括应用程序扩展名。

---- fileName:含义与上述moduleName 相同。但是fileName 必须包括待装载的ARX 应用程序的路径和扩展名。

---- printit:取0 则不显示装载结果,取非0 值则显示。当printit 取非0 值时,如装载成功,则在AutoCAD 命令窗口显示“Runtime Extension is already loaded./",否则,显示“AcRxDynamicLinker failed to load /"。

---- acrxLoadModule() 与AcRxDynamicLinker::loadModule 不同的是:acrxLoadModule() 从$ACAD 定义的AutoCAD 搜索路径自动搜索待装载的ARX 应用程序,并默认ARX 应用程序扩展名为.ARX。



      int ads_arxload(const char *ArxAppName) 函数。在ADS 或ARX 程序里使用

该函数可将一个ARX 模块装载到相应的ADS 或ARX 程序里。该函数的返回值表示装载结果。与该函数对应的AutoLISP 函数是(arxload)。

用ads_arxload() 和acrxLoadModule() 装入一个ARX 应用程序的区别是:用ads_arxload() 装入的ARX 应用程序不仅注册成一个ADS 程序,同时还注册成一个ARX 程序。


--------------------------------------------------------------------------------------------------------------------
关于CAD启动时自动加载程序的研究(六)
菜单的加载:AutoCAD启动时将自动加载默认的基本菜单文件“acad.mnu ”,其默认路径可在“工具→选项→文件→工作支持文件搜索路径”中查看。

其中,后缀为mnu的是原始 ASCII 菜单文件,mnc是已编译的菜单文件,mns是源菜单文件。

AutoCAD启动时会在默认路径中按mns→mnc→mnu的顺序依次查找,找到任何一类文件都可生成mnc文件并加载。如这些文件均未找到,将弹出上述信息窗口。按“确定”进入AutoCAD后工具栏就丢失了,而且相应菜单中没有恢复工具栏的功能。但此时命令行还可以使用,只需要输入“menu”命令,就会弹出一个“选择菜单文件”窗口,找到上述任何一类菜单文件打开即可恢复工具栏。



如果文件损坏或被删除,可以从其它AutoCAD运行正常的计算机上拷贝一个菜单文件按同样的方法加载。当然还可以把可正常使用的菜单文件拷贝到默认路径下,这样AutoCAD将自动加载而不用我们手动设置,此时可用“options”命令进入“选项”窗口查看默认路径。



在加载自定义菜单时,如果通过MENU加载,就会把acad.cui赶跑了。如果想保留acad.cui(CAD默认菜单),应该用MENULOAD来加载(局部加载),这样两个菜单都在,如果不用了,也可以通过这个命令来卸载。用了之后如果不卸载,退出cad之后下次启动还会加载自定义菜单。



怎样在Auto CAD 2006 加载自定义菜单文件?

问题:我想在Auto CAD 2006 加载自定义菜单文件,不改变acad.cui的原有菜单只是在其后加一栏菜单(在"帮助"菜单POP12后加"自定义"菜单POP13)

回答:你可以用写字板程序打开acad.MNU文件,然后按照其格式把POP13的内容写进去,存盘后,重新启动ACAD就行了。如果还不行,就在启动ACAD后键入命令MENU,然后根据提示选择ACAD.MNU。

评分

参与人数 1D豆 +3 收起 理由
SmallBlackCat + 3 资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2014-7-16 20:53:13 | 显示全部楼层
谢谢分享                  
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-10-17 20:21:57 | 显示全部楼层
内容很全,讲的很好。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-11-26 15:59:29 | 显示全部楼层
内容很全,讲的很好。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-12-17 20:02:56 | 显示全部楼层
不错,值得一看。:)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2015-5-11 22:25:14 | 显示全部楼层
Windows API 方法
void SendCmdToAcad(ACHAR *cmd)
{
COPYDATASTRUCT cmdMsg;
cmdMsg.dwData = (DWORD)1;
cmdMsg.cbData = (DWORD)(_tcslen(cmd) + 1) * sizeof(ACHAR);
cmdMsg.lpData = cmd;
SendMessage(adsw_acadMainWnd(), WM_COPYDATA, NULL, (LPARAM)&cmdMsg);
}
这段咋用啊
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 75个

财富等级: 招财进宝

发表于 2015-5-13 12:58:35 | 显示全部楼层
做个记号,
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 770个

财富等级: 财运亨通

发表于 2015-8-15 16:41:00 | 显示全部楼层
好啊 !!!!!!!!!!!!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 770个

财富等级: 财运亨通

发表于 2016-9-12 12:37:26 | 显示全部楼层
做个记号,
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

发表于 2017-9-15 14:07:40 | 显示全部楼层
学习学习了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2020-6-11 12:41:38 | 显示全部楼层
非常有用,多谢分享!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 10个

财富等级: 恭喜发财

发表于 2020-9-22 19:53:07 | 显示全部楼层
thank you code
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-19 00:12 , Processed in 0.445202 second(s), 57 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表