guangdonglbq 发表于 2021-8-28 17:02:17

aardio以com方式开发autocad的库(补充智能提示)

本帖最后由 guangdonglbq 于 2021-9-23 11:36 编辑

    当前的aardio版本已含一个简单的autocad开发库,但缺少智能提示,现予以补充。
    目前补充了智能提示功能的开发库,对写形如:acad.ActiveDocument.ActiveSpace.AddLine(StartPoint, EndPoint)这样,从acad程序到最终操作层的代码的情况,可以实现智能提示,但形如以下的代码,则未实现智能提示:
varactModel=acad.ActiveDocument.ModelSpace;
               actModel.AddLine(pt1,pt2)
   未能确认是什么原因。
   现把补充了智能提示功能的开发库及相关整理的过程资料都发出来,有兴趣的朋友可以一起升级完善相关功能。
   2021年09月23日升级完善,有需要的朋友可重新下载。

旧事阑珊 发表于 2022-8-5 06:04:52

guangdonglbq 发表于 2022-8-4 22:47
AppendOuterLoop参数应该用数组,但,照vba手册抄了一下,下面的代码也不成功。
    import com.acad;
...

谢谢你的回复!
我偿试了几种方式转换数据类型,都不成功,也按VBA手册代码试过,也不行,所以才发贴请教!我看了aardio使用手册上,估计是“COM与aardio间的数据类型转换”这一块的问题,但水平不够,看的不太明白。

jacenhe 发表于 2022-2-13 16:53:38

本帖最后由 jacenhe 于 2022-2-13 16:55 编辑

自动提示的代码里有些语法错误,例如 -> 只是用来转义 . 不能写到代码里。
另外智能提示变量是全局有效的,最好加上前缀避免冲突干扰,例 !Documents. 可能带来问题。

如果基于 com.cad 扩展,也可以这样写:import com.cad;

class com.cad2{
    ctor(...){
      this = ..com.cad(...)
    };
}
这样可以继承标准库所有的功能、同步更新,也可以任意修改扩展。

看了一下你代码里 GetAcCmColor 这几个函数是用不了的,
代码里不能用 -> 代替点,直接写 "AutoCAD.AcCmColor" 就可以。
而且他这个比较特别,必须加上版本号,com.cad 最新版本添加了一个 GetCadInterfaceObject 函数用于做这事。

然后 com.cad 添加了这几个函数:

namespace com;

class cad{

    //.....其他代码省略
   
    GetLayerStateManager = lambda() this.GetCadInterfaceObject("AutoCAD.AcadLayerStateManager");
    GetAcCmColor = lambda( ) this.GetCadInterfaceObject("AutoCAD.AcCmColor");
    GetSecurityParams = lambda() this.GetCadInterfaceObject("AutoCAD.SecurityParams");
}

测试了一下这样写就可以用了。
像 AutoCAD 这样复杂的接口,智能提示不能完全替代文档,如果把所有智能提示做起来工作量太大,建议加一些常用的就可以了。

guangdonglbq 发表于 2022-8-4 22:47:07

旧事阑珊 发表于 2022-8-4 17:10
请教一下!我用Aardio想实现填充效果,总是提示“对象数组无效”,能否指点一二,填充用Aaardio如何写? ...

AppendOuterLoop参数应该用数组,但,照vba手册抄了一下,下面的代码也不成功。
    import com.acad;
    var cad = com.acad();

    patternName = "ANSI31";
    PatternType = 0 ;
    bAssociativity = true;
    var hatchObj = cad.ActiveDocument.ModelSpace.AddHatch(PatternType, patternName, bAssociativity);

      center = {0;0;0};
      radius = 1;
      var outerLoop={};
      outerLoop = cad.ActiveDocument.ModelSpace.AddCircle(center, radius);
      outerLoop = cad.ActiveDocument.ModelSpace.AddCircle({2;2;0}, radius);   
      hatchObj.AppendOuterLoop (outerLoop);
      hatchObj.Evaluate();
      cad.ActiveDocument.Regen();

暂时未能解决这个问题

陨落 发表于 2021-8-29 14:56:18

同一版本打开多个cad,指定特定cad的问题解决了吗?

guangdonglbq 发表于 2021-8-29 15:44:30

陨落 发表于 2021-8-29 14:56
同一版本打开多个cad,指定特定cad的问题解决了吗?

我没偿试,只是有个想法:lisp调用时,想办法发送程序窗口句柄hwnd;在aardio中,通过hwnd调用autocad。不知道是否可行。

陨落 发表于 2021-8-29 21:28:34

guangdonglbq 发表于 2021-8-29 15:44
我没偿试,只是有个想法:lisp调用时,想办法发送程序窗口句柄hwnd;在aardio中,通过hwnd调用autocad。 ...

那你可以研究一下。通过HWND是无法获取到com接口的。我尝试过通过ROT获取,但是这也是一条死路。这个问题aardio作者也回复过我,他的建议跟其他人一样:自己建立一个ROT,那就有点复杂而且不方便了。

leipengshang 发表于 2021-11-5 09:48:09

想问一下 这个智能提示,支持vba自带的函数么

guangdonglbq 发表于 2021-11-9 15:25:40

leipengshang 发表于 2021-11-5 09:48
想问一下 这个智能提示,支持vba自带的函数么

vba用的就com。

landsat99 发表于 2021-11-15 11:52:09

aardio必须赞 国产语言的先锋,铁杆支持!。

landsat99 发表于 2021-11-15 12:00:58

aardio很好 很有特点,也希望能早日摆脱匹马打天下的模式

liuyj 发表于 2021-11-15 21:26:42

要是能不生成exe,而是像c#那样生成dll文件在cad环境下运行,是不是能替代c#用作一种开发方式?

guangdonglbq 发表于 2021-11-16 06:57:56

liuyj 发表于 2021-11-15 21:26
要是能不生成exe,而是像c#那样生成dll文件在cad环境下运行,是不是能替代c#用作一种开发方式?

不能生成dlll。
现在也是一种开发方式了。
看场合使用就好,我现在就在用aardio的com结合lisp写程序。
页: [1] 2 3
查看完整版本: aardio以com方式开发autocad的库(补充智能提示)