Bill Tillman 发表于 2022-7-6 06:49:37

使用LISP填充

首先,很抱歉再次提起这件事。但我正在做最后的努力,尝试使用LISP实现hatch。正如你们许多人所记得的,这是一个完全自动化项目的一部分。不允许用户输入,所有操作都必须使用LISP代码完成。
 
在所附的图片上,你会看到我的quandry。左侧的图像是拍摄前的图像,右侧的图像是我想用hatch命令实现的拍摄后的图像。
 
绿色拉伸是使用LISP引入的块。绿色矩形是用LISP创建的。红色PLINE也使用LISP创建。完成后,我可以手动使用hatch命令,只需在左图中看到十字光标的地方单击一下,它就会完美地填充我想要的区域。所以我认为,很好,让我创建草图,然后在我的LISP程序中编写hatch命令,以选择相同的点,得到右侧所示的结果。
 
但hatch命令似乎不会执行此操作。。。使用LISP。其中一项工作通过手动方法非常简单,对于LISP来说似乎是一项简单的任务。
 
注意:我编写了代码,精心绘制了一条与绿色挤出轮廓密切相关的柱脚线,并将其与另一条柱脚线连接以形成闭合多边形。然后可以使用LISP对其进行填充。但这是一个痛苦的过程,随着客户在其产品线中添加更多的形状,很难编写代码来跟踪挤出型材。
 
这是不是使用LISP无法完成的事情?我发现有时候你可以用鼠标和键盘手动做一些你不能用LISP重新创建的事情,但这是非常少的情况。

GP_ 发表于 2022-7-6 06:59:09

大概
 
 
绘制(红色)多段线
 
插入块
 
vla getboundingbox(多段线+块)
 
缩放->边界框
 
缩放->0.9x
 
(命令“_-hatch”pt“\u P”“AR-CONC”“1.0”“0.0”“”)
 

(setq EL(entlast))
(命令“_-boundary”pt”)
(如果(/=EL(entlast))
(命令“_-hatch”“\u S”“\u L”“”“\u P”“AR-CONC”“1.0”“0.0”“”)
)

Bill Tillman 发表于 2022-7-6 07:04:50

GP,谢谢。我尝试了第二种方法,效果很好。唯一的问题是它使边界线保持不变。当这一切都完成后,我想要的是在混凝土板的顶部和底部各有一条线。用户对此非常挑剔。
 

(setq EL (entlast))
(command "_-boundary" (polar pt1 pi (+ afrmwd 2)) "")
(if (/= EL (entlast))
(command "_-hatch" "_S" "_L" "" "_P" "AR-CONC" "0.25" "0.0" "")
)

 
我将对此进行更多的修补,看看是否可以得到用户要求的最终结果。最棒的是,我不必对挤出型材和边界进行所有繁琐的跟踪,甚至可以细化嵌入板并围绕其工作。
 
谢谢,如果你有任何其他建议,请告诉我。

Bill Tillman 发表于 2022-7-6 07:15:08

好的,我想我终于找到了。我以前从未真正使用过边界命令。无论如何,这是一个选择多段线和边界线的问题,然后对它们都进行(entdel)。我现在可以在板的顶部和底部画一些简单的线,这样这些挑剔的用户就能得到他们想要的。。。至少在这个问题上。
 
谢谢GP。这是一个很好的建议。

GP_ 发表于 2022-7-6 07:19:42

很乐意帮忙。

Bill Tillman 发表于 2022-7-6 07:34:22

我是疯了还是怎么了。。。。?在学习LISP的开始,我被告知,有一些编码方法可以证明是不稳定的。。。这有时是有效的,有时是无效的。这是处理LISP编程的困难之一,尤其是当我的客户看到该死的东西在工作,然后第二天他们给我一个错误列表,其中包括我前一天刚刚工作的东西。
 

(defun slab1 (_Point1_Point2        _CPoint1 _CPoint2 _Left           _Right
      _Up      _Down        /       _h1          _l1           l2
      _pl1   _pl2        _r1
   )
(command "._CLAYER" "Concrete")
   (command "._PLINE"
       (polar _Point1 _Down (- _afrmdp1 0.4375))
       (polar _Point1 _Down (- slabdp 0.4375))
       (polar (polar _Point1 _Down (- slabdp 0.4375)) _Left 4)
       (polar (polar _Point1 _Down 1.0625) _Left (+ afrmwd 3))
       (polar (polar _Point1 _Left (+ afrmwd 3)) _Up 0.4375)
       (polar (polar _Point1 _Left afrmwd) _Up 0.4375)
       "")
   (setq _pl1 (entlast))

(command "_-boundary" (polar _Point1 _Left (+ afrmwd 2)) "")
(setq EL (entlast))
(if (/= EL (entlast))
   (command "_-hatch" "_S" "_L" "" "_P" "AR-CONC" "0.25" "0.0" "")
   ); end if
(setq _h1 (entlast))
(entdel EL)
(entdel _pl1)
   ; DRAW THE TOP OF THE SLAB BACK IN
   (command "._LINE" (polar (polar _Point1 _Left afrmwd) _Up 0.4375)
                       (polar (polar _Point1 _Left (+ afrmwd 3)) _Up 0.4375) "")
   (setq _pl1 (entlast))
   ; DRAW THE SIDE AND THE BOTTOM OF THE SLAB BACK IN
   (command "._PLINE" (polar _Point1 _Down (- _afrmdp1 0.4375))
                       (polar _Point1 _Down (- slabdp 0.4375))
                       (polar (polar _Point1 _Down (- slabdp 0.4375)) _Left 4) "")
   (setq _pl2 (entlast))
   (command "._MIRROR" _pl1 _pl2 _h1 "" _CPoint1 _CPoint2 "")
(princ)
); end slab1

 
舱口似乎出了问题。我只能假设它的其余部分是有效的,因为当它完成时,有一个漂亮的混凝土舱口,周围留有足够的线来形成板的部分剖视图,或者有一个剖视图,但舱口只是一堆斜线,几乎看起来像是AR-CONC舱口。
 
我写这篇文章是为了处理图纸的前视图和侧视图。这就是_Up,_Down,等等。。。都是关于。这有多个条件,所以我把它做成了模块。我这样称呼例行程序:
有些时候,它运行得很好。然后我转到代码的另一部分,它调用了几乎相同的例程,但它不起作用。然后我回到5分钟前的第一个程序,它工作得很好,现在它也像第二次尝试一样把舱口搞砸了。
 
Q: 这是一种长期不稳定的代码吗?还是我只需要去检查一下脑袋?

Bill Tillman 发表于 2022-7-6 07:41:55

正如我之前提到的,我宣誓支持NDA的左右两面,所以我可以发布的代码和图片数量有限。但我刚刚在这个问题上观察到了一些有趣的事情。左边的图像是我在出错时得到的结果。右边的图片是我在正确的时候得到的。图案填充用软管冲洗,边界命令中的一些线不会被entdel命令擦除。这与产生这两个的代码完全相同。唯一的区别是左边的一个是全速运行的,右边的一个是在代码开始之前用一个断点运行的,我用F8键逐步完成了它。
 
今天早些时候,这辆车全速行驶,一切都很好。我现在正在对此进行更多测试,因为最终结果,当它正确时,正是这里的用户所要求的。

GP_ 发表于 2022-7-6 07:46:35

要使用边界命令,所使用的几何体必须完全显示在屏幕上。
 
 
 
 
然后怎么可能?
 

Bill Tillman 发表于 2022-7-6 07:51:52

GP,再次感谢。我确实发现,像你一样,要使其持续工作,唯一的方法就是使用“缩放”命令。让我不舒服的是,它似乎在没有缩放命令的情况下也能工作,但迟早会像它那样滑出轨迹。所以我现在在块中插入了更多的缩放命令。
页: [1]
查看完整版本: 使用LISP填充