KRBeckman 发表于 2022-7-6 11:31:44

更快的连续3dFaces Li

大家好,
 
很多时候,当我对绘制的对象进行曲面处理时,我的曲面共享一条边(和两个垂直度),因此,我不需要两次拾取这些点,而是希望使用lisp,获取为垂直度3和4选择的点,并将其保存,以便稍后分别作为垂直度2和1使用。
 
以下是我目前掌握的信息:
 
(defun c:sfs ()
(if (eq rst "")
   (setq rst "Yes")
   (progn
   (initget "Yes No")
   (setq rst (getkword "\nWould you like to reset this macro? (Y, <N>)"))))

(if (eq rst "Yes")
   (progn
   (setq art ""
    pt1 ""
    pt2 ""
    pt3 ""
    pt4 ""
    px1 ""
    px2 ""
    px3 ""
    px4 ""
    py1 ""
    py2 ""
    py3 ""
    py4 ""
    pz0 ""
    edh "")
   (initget 1 "Rectangular Circular")
   (setq art (getkword "\nWhat type of Array?< Rectangular Circular >: "))
   (command "_.pline" pause pause pause pause "cl"))
   (progn
   (command "_.pline" pt1 pt2 pause pause "cl")))

(setq pl1 (mapcar 'cdr(vl-remove-if '(lambda(x)(/= 10(car x)))(entget(entlast))))
px1 (car   (nth 0 pl1))
py1 (cadr(nth 0 pl1))
pz0 (nth 0 (mapcar 'cdr(vl-remove-if '(lambda(x)(/= 38(car x)))(entget(entlast)))))
px2 (car   (nth 1 pl1))
py2 (cadr(nth 1 pl1))
px3 (car   (nth 2 pl1))
py3 (cadr(nth 2 pl1))
px4 (car   (nth 3 pl1))
py4 (cadr(nth 3 pl1))
pt1 (list px1 py1 pz0)
pt2 (list px2 py2 pz0)
pt3 (list px3 py3 pz0)
pt4 (list px4 py4 pz0))
(command "_.erase" "l" "")

(entmake (list (cons 0 "3DFACE")
(cons 8 "Temp")
(cons 100 "AcDbEntity")
(cons 100 "AcDbFace")
(cons 10 pt1)
(cons 11 pt2)
(cons 12 pt3)
(cons 13 pt4)
(cons 70 15))))
(cond (eq art "Rectangular") (progn
      (setq pt1 (list px4 py4 pz0)
   pt2 (list px3 py3 pz0)))
      
(eq art "Circular")    (progn
      (setq pt1 (list px1 py1 pz0)
   pt2 (list px4 py4 pz0))))
)
 
我离得很近,但最终并没有改变pt1和pt2的坐标。
 
任何帮助都是非常感激的。

Lee Mac 发表于 2022-7-6 11:35:50

我真的不建议这样做:
 

   (setq art ""
    pt1 ""
    pt2 ""
    pt3 ""
    pt4 ""
    px1 ""
    px2 ""
    px3 ""
    px4 ""
    py1 ""
    py2 ""
    py3 ""
    py4 ""
    pz0 ""
    edh "")

 
只需定位变量。

KRBeckman 发表于 2022-7-6 11:40:32

为什么?会出什么问题?本地化变量的问题是,我希望在下次运行lisp时保留点1和2的值。这就是存储这些值的全部意义,这样我就不必在每个点上点击两次。

Lee Mac 发表于 2022-7-6 11:44:01

 
很多事情,它们可能会与其他程序冲突,出于某种原因,您正在将它们全部设置为空字符串。。。?
 
您可以将点1和2保留为全局变量,但所有其余的都可以本地化。

Lee Mac 发表于 2022-7-6 11:50:47

这样怎么样:
 

(defun c:sfs(/ 3DFace ent z ptLst)

(defun 3DFace (p1 p2 p3 p4)
   (entmakex (list (cons 0 "3DFACE")
                   (cons 8 "Temp")
                   (cons 10 p1)
                   (cons 11 p2)
                   (cons 12 p3)
                   (cons 13 p4)
                   (cons 70 15))))

(if (and *pt1 *pt2 *art
          (not (initget "Yes No"))
          (eq "No" (cond ((getkword "\nWould you like to reset this macro? (Y, <N>)")) ("No"))))

   (command "_.pline" *pt1 *pt2 pause pause "_C")
   (progn

   (initget 1 "Rectangular Circular")
   (setq *art (getkword "\nWhat type of Array?< Rectangular Circular >: "))

   (command "_.pline" pause pause pause pause "_C")))


(if (eq "LWPOLYLINE" (cdr (assoc 0 (entget (setq ent (entlast))))))
   (progn
   (setq z (cond ((cdr (assoc 39 (entget ent)))) (0.0)))
      

   (apply '3DFace (setq ptLst (mapcar
                                  (function
                                    (lambda (x)
                                    (append x (list z))))
                                  (mapcar (function cdr)
                                          (vl-remove-if-not
                                          (function
                                              (lambda (x) (= 10 (car x)))) (entget ent))))))
   (entdel ent)

   (cond ((eq *art "Rectangular")

            (setq *pt1 (nth 3 ptLst) *pt2 (nth 2 ptLst)))

         ((eq *art "Circular")

            (setq *pt1 (nth 0 ptLst) *pt2 (nth 3 ptLst))))))

(princ))

KRBeckman 发表于 2022-7-6 11:54:14

是的,效果很好。。。但我仍然想知道为什么我的方式不起作用。有什么见解吗?

Lee Mac 发表于 2022-7-6 11:56:03

 
您的COND语句没有正确定义的文本表达式。

KRBeckman 发表于 2022-7-6 12:00:29

明白了,再次感谢你的帮助。

Lee Mac 发表于 2022-7-6 12:06:39

 
不客气

KRBeckman 发表于 2022-7-6 12:11:19

嘿,李,我刚刚意识到这个问题。。。它仅在顶部ucs上创建三维面。。。标高为“0”。我想用它来创建三维面,在ucs上绘制多段线。
 
我认为这与使用LWPOLYLINE有关,但我不知道如何更改它。
 
有什么建议吗?
页: [1] 2
查看完整版本: 更快的连续3dFaces Li