StevJ 发表于 2022-7-5 18:03:32

如何将WCMATCH添加到程序

这个小家伙将在你的绘图模型空间中勾勒出每个命名视图的轮廓。很有帮助,效果很好,虽然我相信它可以写得更好,这是它的原始形式,由未知作者在1993年写的,是一个更大的程序的一部分。
我的愿望是合并一个wcmatch语句,这样它只显示以H1结尾的视图,但我一直无法掌握wcmatch,所以我必须寻求这方面的帮助。
一个图形中只有一个命名视图以这种方式结束,但它存在于所有图形中,如果我能快速检查一个视图的位置,在将出现的许多命名视图中,它肯定会使图形检查更容易、更快。
 
提前思考:只要简单地合并一个合适的wcmatch语句,该程序也可以很容易地进行调整,以在将来显示其他特别命名的视图,如果需要的话。
 
问题是我不知道把它放在哪里,也不知道它应该如何配置。
它和while语句是“and”吗?
给它自己的“如果”行?如果是,在哪里?
“vname”呢?这是关键吗?
 
提前感谢您的帮助。
 
史蒂夫

satishrajdev 发表于 2022-7-5 18:09:24

WCMATCH的使用:-
_1$ (wcmatch "test-h1" "*h1")
T
_1$ (wcmatch "test-h12" "*h1")
nil
_1$ (wcmatch "test-h12" "*h1*")
T
 
试试这个:-
(defun c:test (/ tbdata vname Y X CP P1 P2 P3 P4)
(if (setq tbdata (tblnext "VIEW" T))
   (while tbdata
   (setq vname (strcase (dxf 2 tbdata))) ;extract view name
   (if (wcmatch vname "*H1")
(progn
(setq        Y(* (dxf 40 tbdata) 0.5) ;view height
        X(* (dxf 41 tbdata) 0.5) ;view width
        CP (dxf 10 tbdata)
        P1 (list (- (car CP) X) (- (cadr CP) Y))
                                ;lower left corner
        P2 (list (- (car CP) X) (+ (cadr CP) Y))
                                ;upper left corner
        P3 (list (+ (car CP) X) (+ (cadr CP) Y))
                                ;upper right corner
        P4 (list (+ (car CP) X) (- (cadr CP) Y))
                                ;lower right corner
)                                ;setq
(grdraw P1 P2 7 1)                ; draws vector
(grdraw P2 P3 7 1)
(grdraw P3 P4 7 1)
(grdraw P4 P1 7 1)
)                                ;* end PROGN
   )                                        ;* end if
   (setq tbdata (tblnext "VIEW"))        ;* get next view
   )                                        ;* while end
)                                        ;* endif
(prompt " Done")
(princ)
)

StevJ 发表于 2022-7-5 18:14:22

Satish Rajdev,
 
你的修改正是我想要的。
效果完美。你让它看起来很简单。
好啊我必须研究这个。
非常感谢。
 
史蒂夫

satishrajdev 发表于 2022-7-5 18:21:10

不客气

Lee Mac 发表于 2022-7-5 18:22:13

FWIW,代码可以稍微缩短:
(defun c:test ( / c l v x y )
   (while (setq v (tblnext "view" (not v)))
       (if (wcmatch (strcase (cdr (assoc 2 v))) "*H1")
         (progn
               (setq x (* 0.5 (cdr (assoc 40 v)))
                     y (* 0.5 (cdr (assoc 41 v)))
                     c (cdr (assoc 10 v))
                     l (list (mapcar '- c (list x y))
                           (mapcar '+ c (list x (- y)))
                           (mapcar '+ c (list x y))
                           (mapcar '+ c (list (- x) y))
                     )
               )
               (mapcar '(lambda ( a b ) (grdraw a b 7 1)) (cons (last l) l) l)
         )
       )
   )
   (princ)
)

StevJ 发表于 2022-7-5 18:29:17

 
嘿,现在。太棒了。
我将研究这些差异。
李,谢谢你的程序升级。
 
史蒂夫

Lee Mac 发表于 2022-7-5 18:32:48

不客气,史蒂夫,请随意提问代码。

StevJ 发表于 2022-7-5 18:38:46

李,
 
在您的网站和Afralisp上花了一些时间试图破译您的代码后,出现了一些问题。
我理解grdraw部分的作用,但如果这是正确的项,它的“a b”(和λ)如何指向上面列表中的x和y坐标?
 
此外,在cons部分,为什么是“last”而不是“list”?
该框是通过从下到上处理列表来绘制的吗?
如果“l”列表表示直线长度或顶点,为什么只有3个而不是4个?
史蒂夫

Lee Mac 发表于 2022-7-5 18:44:27

 
嗨,史蒂夫,
 
为了帮助解释如何计算mapcar表达式,请考虑以下控制台教程:
 
假设变量“l”被分配了以下四个坐标(矩形的顶点)列表:
表达式(cons(last l)l)将把列表中的最后一项推到列表的前面:
现在,考虑当提供的任何列表参数被完全处理时,mapcar将停止计算,例如:
因此,使用我们的两个列表评估以下mapcar表达式将得到以下结果:
要将其可视化,请考虑一个顶点字母为a到D的矩形,从左下角开始,逆时针绕矩形旋转:
 

 
现在,列表“l”包含顶点:
9,表达式(cons(last l)l)包含顶点:
因此,mapcar表达式采用以下形式:
因此,grdraw函数使用以下参数进行评估:
12

satishrajdev 发表于 2022-7-5 18:48:05

很好的解释
页: [1] 2
查看完整版本: 如何将WCMATCH添加到程序