执行顺序的LISP脚本
大家好。这是我第二次尝试发布这个帖子,因为不知何故我自动注销了。谢天谢地,我通过记事本文件保存了大部分内容。
现在谈正事:我擅长CAD,但说到LISP,我是一个完全的初学者。我的老板/经理要求我创建一个LISP例程,该例程将与
来自命令行的命令,并将接收用户输入,以与图形中的坐标尺寸进行比较。我已经做了两天了,试着把我的脑袋绕到最基本的东西上,我可以告诉你我的大脑受伤了。任何类型的编程都不是我的专长,我仍在努力下载HTML。不管怎么说,我老板喜欢这样做的原因是,有时我们的图纸有十几到50个左右的坐标尺寸,对照一个点去检查它们是很乏味的。我的老板给了我自由支配如何设计这个吸盘的权利,但我是一个新手,所以我很难对它进行编程。下面是lisp例程应该能够完成的任务。
LISP的思想是:
1)加载lisp并用defun C:命令启动。
2)让用户选择一个“原点”进行比较(因为我们并不总是使用0,0,0)。
3.)lisp获取并存储该点。
4.)它仅扫描图纸的坐标尺寸。
5.)将用户的原点与坐标尺寸的原点进行比较。(我认为这将是最接近0,0,0的端点。例如,如果我们有15个维度,则有30个端点。最接近的15个端点将与用户的原点进行比较。)
6)它创建了一个名为DIM_WRONG[或其他]的新层,并使该层变红。
7.)通过在尺寸周围绘制红色框或旋转云,提请注意不正确的坐标尺寸(扫描并与用户原点进行比较的尺寸)。这些rev云被放置在DIM_错误的层上,层设置为not plot。这样,只需点击几下,我们就可以轻松检查15到30以及更多的坐标尺寸。在比较中会有一个公差,高达1/64英寸的公差。如果由于编程结构需要调整排序步骤,那么不管怎样,只需要将这些坐标尺寸与用户指定的原点(通过键盘或鼠标输入)进行比较。
再说一次,我是Lisp的初学者,我一直在尝试完成片段,但只完成了4个简单的片段(从列表中)。我从来都不擅长编程。
如果您能提供任何帮助,我将不胜感激,并感谢您提供的任何建议/知识。 2个建议1发布代码,2使用dumpit。lsp用于研究对象或(entget(car(entsel))的属性,并查看dxf代码。
Command: dumpit
Select object: ; IAcadDimOrdinate: AutoCAD Ordinate Dimension Interface
; Property values:
; Measurement (RO) = 7930.37
; TextPosition = (7930.37 1603.47 0.0)
(entget (car (entsel))
(10 0.0 0.0 0.0) (11 7930.37 1603.47 0.0) (12 0.0 0.0 0.0)(13 7930.37 2962.13 0.0) (14 7930.37 1604.26 0.0) these may be useful
下面是我的代码。这是我到目前为止组装的,并且“有效”并且没有抛出任何错误/做了需要的事情。
新图层:
(command "-layer" "m" "DIM_WRONG" "c" "red"
"DIM_WRONG" "p" "n" "s" "DIM_WRONG" "" "")纵坐标检查:
用户存储原点
试图创建列表的开始
Revcloud尝试:
再说一次,我和lisp一样绿,我还在编写HTML。这方面[编程……甚至SQL都不是我的专长] Revcloud需要一系列点或对象,可能从测试角度使用圆并使用文本位置作为中心。协会10。
为什么所有的迷你defuns?是的,我使用了很多库defun,但这些都是唯一的,只需编写一个主defun,以定位变量。我对库示例(revcloud obj)的理解可以是任何对象,而不是硬编码到pline。
6
使用dim作为对象v,在文本位置使用圆
命令:REVCLOUD
最小弧长:150.0000最大弧长:150.0000样式:正常
指定起点或[弧长/对象/样式]:o
选择对象:无法转换对象,必须是多段线、样条曲线或圆。
选择对象:*取消* 是的,我意识到了这一点,并在网上找到了另一个lisp片段,它将更好地服务于我的目的。
这些都是为了确保我所做的工作是有效的,而不是抛出错误。正如我所说的,我在编写这个相当复杂的lisp例程时学习了这些东西(对我来说很复杂),这些独特的defuns帮助我分解代码,确保各个片段正常工作。我肯定计划在我把所有的单件作品都制作好并放在一起的时候把它们拿出来。
这对我来说将是一个痛苦的过程。主要是因为这不是我的专长,我很难掌握这些概念。 为了一次测试一行从记事本复制到命令行,我做的另一件事是在代码中放入一些princ,比如(princ“wow1”)“wow2”等等,然后我可以看到它停在哪里。或者使用vlide,您可以使用最后一个断点来查看代码停止的位置。您可以检查变量值,查找NIL,这意味着尚未设置变量。李在使用VLIDE方面有很好的指导。 我已将此线程移动到Lisp部分。对于未来的lisp问题,请在此处发布:http://www.cadtutor.net/forum/forumdisplay.php?21-AutoLISP Visual LISP amp DCL 我在理论上对我的方法做了一些修改。我想做一个“如果”的陈述,而不是比较和对比。括号“[]”表示我不知道使用什么语法使其工作,只是我想让它做什么。
我将在不使用代码括号的情况下进行此操作,以便您可以看到我的想法。
(定义c:纵坐标检查()
[此段在autocad中工作]
(命令“-layer“m”DIM\u WRONG“c”red”
“DIM\u WRONG”“p”“n”“s”“DIM\u WRONG”“”“”
[以及这一部分]
(setq原点(getpoint“选择点或类型
坐标:“))
[从这里开始,我几乎不懂语法]
如果([坐标尺寸点“10”]=原点[用户输入])
(progn([不做任何事]);我想我把‘零’放在这里了?
(/=原点);这一部分从我需要做的事情开始
(setq ss(ssget[选择对象]'((100.“AcDbOrdingDimension”))));因此,它在if语句中选择坐标维度。我想我可能把结构倒过来了?
([使其绘制实体的语法]“(0.”线)(100。“AcDbLine”)
(cons 10 LineStPt)(cons 11(LineEdPt);告诉它画出终点线
([在坐标点“10”到“11”上]);我用dumpit计算出正确的端点,这样就可以画出这条线,并表示正确的错误坐标尺寸
();对于每个坐标尺寸
)))
让我知道我做错了什么,重写,不管怎样。
我们仍然不知道如何确定哪个维度是正确的,不需要重新计算,以及哪个维度在选取的原点方面是错误的。。。复杂的 如果用户点原点=坐标标注点10,则跳过它。如果不相等,则在坐标标注上绘制一条红线,从点10到点11,该点位于坐标点的文本处。
基本上,我要说的是,用户选择的原点是正确的原点,如果另一个坐标维度(点10)落在它上面,则该坐标维度被视为“正确”,并跳过它。如果坐标尺寸[点10]不落在用户原点上,则会绘制一条线,指示其错误。
以下是我生成的代码:
我把它放在Visual Lisp中,这就是产生的格式。获取“错误的定义语法”错误。
页:
[1]
2