乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 14|回复: 14

[编程交流] 从C++代码运行Lisp

[复制链接]

1

主题

5

帖子

4

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 06:16:02 | 显示全部楼层 |阅读模式
大家好,
 
我想知道是否可以通过在Visual Studio中构建(运行)C++代码在AutoCAD中运行lisp。我的意思是,我可以打开AutoCAD,并行运行C++代码,并在AutoCAD中自动加载lisp吗?
我要使用的lisp是“ascpoint”,它获取一个文本文件,其中输入坐标,并在这些坐标处插入点。
 
任何帮助都将不胜感激。
 
谢谢
亚历克斯
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 06:21:14 | 显示全部楼层
欢迎来到CADTutor,Alex;祝贺你第一次发帖!
 
 
首先,您为什么不简单地调试一个新的AutoCAD过程?
 
 
 
考虑到ObjectARX(C++),比如。NET(C#、F#、VB等)编译成一个程序集,该程序集需要[ARX/NET]-加载到AutoCAD的活动会话(进程)中。。。做你想做的事对一个男人来说是不可能的。NET assembly(因为没有这样的NETUNLOAD CommandMethod/LispFunction方法),但是,我怀疑您的ARX*可能*能够,因为它可以随后被ARXUNLOAD-ed。
 
我认为您的VS项目可能需要获取活动的AutoCAD进程,并使用COM API调用LISP(不确定ARX为这类事情公开了哪些API?)。
 
我通常编码。NET插件,它们是在会话开始时加载的,或者是按需加载的,因此我恐怕在这里无法为您提供更多帮助,因为ObjectARX不是(目前)我所擅长的语言。我能提供的唯一其他建议是,ARX可以通过acedInvoke()方法直接调用LISP。
回复

使用道具 举报

180

主题

639

帖子

463

银币

中流砥柱

Rank: 25

铜币
897
发表于 2022-7-6 06:25:41 | 显示全部楼层
简而言之,答案是肯定的。您可以构建一个C#项目,该项目将打开AutoCAD或使用其已打开的现有实例,然后向其发送一个命令,该命令将加载并运行您选择的LISP程序。我总是这样做。我使用COM方法,更喜欢尽可能远离AutoCAD环境。我使用的LISP代码还读取文本文件以输入创建图形。哦,我应该提到我使用VB。净额。如果你在互联网上搜索,你会发现很多这样做的例子。它看起来像这样。为此,您需要添加对AutoCAD的引用。
 
  1. Imports AutoCAD
  2. Module LaunchAutoCAD
  3.    '**************************************************************************************************************
  4.    ' LAUNCH AUTOCAD & LISP
  5.    '**************************************************************************************************************
  6.    Sub Launch_AutoCAD(ByVal DwgName As String)
  7.        Dim vAcadApp As AcadApplication
  8.        Dim vAcadDoc As AcadDocument
  9.       
  10.        Dim DwgPath As String = "\\My_Path_To\Engineering\Automated Drawings"
  11.        Dim LispPath As String = "//My_Path_To/LISPFiles/"
  12.        Try
  13.            If Process.GetProcessesByName("acad").Length > 0 Then
  14.                vAcadApp = GetObject(, "AutoCAD.Application.19")
  15.            Else
  16.                vAcadApp = New AcadApplication
  17.            End If
  18.            vAcadApp.Visible = True
  19.            vAcadApp.WindowState = AcWindowState.acMax
  20.            vAcadDoc = vAcadApp.Documents.Open(DwgPath & DwgName, True)
  21.            vAcadDoc.SendCommand("(load """ & LispPath & My_Lisp & ".lsp"" ""The load failed"") " & Cmd_To_Start_LISP_Program & Chr(13))
  22.        Catch ex As Exception
  23.        Finally
  24.            vAcadApp = Nothing
  25.            vAcadDoc = Nothing
  26.        End Try
  27.    End Sub

 
这段代码大约在一年前与我共享,它是为AutoCAD 13配置的。当我的项目全天候通过Internet收到请求时,它还会使AutoCAD实例保持打开状态。也许有更好的方法,但这适合我的需要。
回复

使用道具 举报

1

主题

5

帖子

4

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 06:29:47 | 显示全部楼层
感谢您的回复!
我不知道你所说的“简单地调试一个新的AutoCAD进程”是什么意思。不幸的是,我对这个领域有点陌生(使用Lisp和运行代码在AutoCAD中实现一些事情)。
我不坚持使用Lisp来实现我想要的。我甚至宁愿不使用它!我试图实现的是编写一段C++代码,运行后将使AutoCAD获得一个包含坐标作为输入的文本文件,并在这些坐标处插入点(无需在AutoCAD中执行任何操作)。
你能帮我朝这个方向走吗?
 
谢谢,
 
亚历克斯
回复

使用道具 举报

1

主题

5

帖子

4

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 06:36:34 | 显示全部楼层
嗨,比尔,
 
好像是我在找的!但是,你能详细说明一下我如何让它运行吗?我在网上搜索了一下,但没有成功。
 
谢谢
 
亚历克斯
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 06:40:05 | 显示全部楼层
 
我现在忙得不可开交,但要获得一个AutoCAD实例,请阅读此线程。
 
您应该能够在不从ObjectARX(C++)API本机调用LISP的情况下完成所需的工作。。。我是一个。NET API的家伙(C#,VB.NET),不幸的是。
 
FWIW-特别是如果你是AutoCAD开发新手,如果你还不擅长C++,你可以很容易地跳进C,因为它也可以做你想做的一切。
 
干杯
回复

使用道具 举报

1

主题

5

帖子

4

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 06:46:00 | 显示全部楼层
 
我刚刚看了这个帖子,比尔在那里的第一篇帖子正是我要找的。我只是运行它有问题。我需要知道剩下的代码是什么,需要添加哪些引用等等。
如果我能运行这些代码就太好了。
我可以使用VB。
 
谢谢,
 
亚历克斯
回复

使用道具 举报

180

主题

639

帖子

463

银币

中流砥柱

Rank: 25

铜币
897
发表于 2022-7-6 06:48:56 | 显示全部楼层
首先,我看到您正在运行AutoCAD 2012。我认为那个版本的数字19变为18。至于代码的其余部分,可以用许多方法来回答。使用AutoCAD和总是有多种方法。NET项目。但是,以上代码应该通过打开AutoCAD或使用其现有实例来启动。一旦您的项目执行“SendCommand”部分,它将打开您想要的任何LISP文件,然后执行它。LISP文件可以读取点的文本文件,并将其放置在模型空间中。
 
我认为您也可以在AutoCAD环境中执行此操作。我的项目是完全自动化的,不允许用户输入。你的设置听起来有点不同,所以你真的可以只使用C。NET,VB。NET或普通的旧LISP本身。LISP可以很容易地打开和读取文本文件。除此之外,我们还需要更多地了解您的文件格式等。。。提供建议。
 
对不起,我现在看到你想跑出一个点。lsp,这是一个已经存在的LISP程序。上面的代码可以指向这样一个文件,但我不清楚为什么需要使用另一个开发环境来运行它。如果您能进一步解释一下为什么需要第二个开发平台来运行这个LISP,可能会有所帮助。
回复

使用道具 举报

1

主题

5

帖子

4

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 06:54:32 | 显示全部楼层
账单
 
我试图实现的是制作一个VB代码,当我运行它时,它将读取一个包含坐标的文本文件,并在AutoCAD中在该坐标处插入一个点。我还希望它自动化,我不想在AutoCAD中做任何事情(例如键入命令)。如果你能在这方面帮助我,我将不胜感激。
另外,你能告诉我要为上面的代码添加哪些引用吗?
 
谢谢,
 
亚历克斯
回复

使用道具 举报

180

主题

639

帖子

463

银币

中流砥柱

Rank: 25

铜币
897
发表于 2022-7-6 06:55:14 | 显示全部楼层
很抱歉延迟回复。您需要为您的AutoCAD版本添加参考,在您的情况下,将是“AutoCAD 2012类型库”。当您添加引用时,您将在COM选项卡下找到它。
 
现在这个方法的问题是如果你想要VB。NET程序在AutoCAD环境中运行
您将不会使用COM引用。你可以做到这一点,因为我使用COM方法,所以我的速度不够快。我的意思是我使用VB。NET加载/打开AutoCAD,启动图形模板,然后加载并执行一个LISP文件,该文件完成所有工作。在您的情况下,LISP文件将读取文本文件并插入点。 
有几个LISP文件已经在那里做这件事。李·麦克在他的网站上有一个,杰弗里·桑德斯有一个XYZImport。lsp在这方面做得很好。但是,根据您的需要定制它需要做更多的工作。我们都会尽力帮忙。发回你到目前为止所做的事情。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-10 18:30 , Processed in 0.808042 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表