乐筑天下

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

[编程交流] 线型手柄

[复制链接]

2

主题

10

帖子

9

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 18:43:46 | 显示全部楼层 |阅读模式
你好
 
三个月来,我一直在学习lisps。
我有一个想法,完成了90%,我遇到了难题。
 
这是一个演示
 
问题
 
看不见的线是虚线,好的,没问题。
194352jhyeqzrzgwkwgmbq.png
 
可见线必须是连续的,而不是虚线。
194353t5v4l551p5zp8q6h.png
 
  1. (defun c:pps  (/ mm_lay pi2 2pi 3pi2 les i pltlr pltud clt plt
  2.                 obj info ac0 dr40 pt10 starc edarc pt11 pt10s p10
  3.                 n alist alist1 alist2 lft rht upt dnt cor1 cor2 cor3
  4.                 cor4 pcenter locat key xcor1 xcor2 xcor3 xcor4 plistn
  5.                 loc1 loc2 locat2 locn1 locn2 lcline0 clocat clocat2
  6.                 lcline1 lcline2 celine0 celine1 celine2 pt1 pt2
  7.                 oldline pt1 pt2 pt3 pt0 *error* erases mvs vxs)
  8.                
  9. (defun erases (ss / i)
  10. (setq i -1)
  11. (repeat (sslength ss)
  12.         (entdel (ssname ss (setq i (1+ i))))
  13. )
  14. )
  15. (defun mvs (lst / a lst2)  
  16. (while (setq a (car lst) lst2 (cons a lst2) lst (vl-remove a lst)))
  17. (reverse lst2)
  18. )
  19. (defun vxs (e / i v lst)
  20. (setq i -1)
  21. (while
  22.         (setq v (vlax-curve-getpointatparam e (setq i (1+ i))))
  23.         (setq lst (cons v lst))
  24. )
  25. (reverse lst)
  26. )
  27. (defun *error*(s)  
  28. (setvar 'cmdecho 0)
  29. (command "_.undo" "e")
  30. (setvar 'cmdecho 1)
  31. (redraw)
  32. )
  33. (if (null (tblsearch "layer" "03centreline"))
  34.         (progn (setq mm_lay (getvar "CLAYER"))
  35.                 (setvar "cmdecho" 0)
  36.                 (command "_layer" "m" "03centreline" "c" "1" "" "l" "center" "" "lw" "0.18" "03centreline" "")
  37.                 (setvar "cmdecho" 1)
  38.                 (setvar "clayer" mm_lay)
  39.         )
  40. )
  41.        
  42. (if (null (tblsearch "layer" "04dashed"))
  43.                 (progn (setq mm_lay (getvar "CLAYER"))
  44.                         (setvar "cmdecho" 0)
  45.                         (command "_layer" "m" "04dashed" "c" "2" "" "l" "DASHED" "" "lw" "0.18" "04dashed" "")
  46.                         (setvar "cmdecho" 1)
  47.                         (setvar "clayer" mm_lay)
  48.                 )
  49. )
  50. (setq pi2 (/ pi 2))
  51. (setq 2pi (* pi 2))
  52. (setq 3pi2 (/ (* 3 pi) 2))
  53. (setq les (ssget '((0 . "LINE,CIRCLE,ARC,LWPOLYLINE")
  54.                                 (-4 . "<NOT")
  55.                                 (8 . "*03centreline*")
  56.                                 (-4 . "NOT>")
  57.                                 )
  58.                 )
  59. )
  60. (setq i 0)
  61. (repeat (sslength les)
  62.         (setq obj (ssname les i))
  63.         (setq info (entget obj))
  64.         (setq ac0 (cdr (assoc 0 info)))
  65.         (cond
  66.                 ((= ac0 "CIRCLE")
  67.                 (progn
  68.                         (setq dr40 (cdr (assoc 40 info)))
  69.                         (setq pt10 (cdr (assoc 10 info)))
  70.                         (setq clt (cons pt10 clt))
  71.                         (setq pltlr (cons (polar pt10 0 dr40)
  72.                                                         (cons (polar pt10 pi dr40) pltlr)
  73.                                                 )
  74.                         )
  75.                         (setq pltud (cons (polar pt10 pi2 dr40)
  76.                                                         (cons (polar pt10 3pi2 dr40) pltud)
  77.                                                 )
  78.                         )
  79.                 );end_progn
  80.                 )
  81.                 ((= ac0 "ARC")
  82.                                 (setq dr40 (cdr (assoc 40 info)))
  83.                                 (setq pt10 (cdr (assoc 10 info)))
  84.                                 ;; (setq clt (cons pt10 clt))
  85.                                 (setq starc (cdr (assoc 50 info)))
  86.                                 (setq edarc (cdr (assoc 51 info)))
  87.                                 (if
  88.                                         (or
  89.                                                 (and (= starc 0) (= edarc pi))
  90.                                                 (and (= starc pi) (= edarc 0))
  91.                                                 (and (= starc pi2) (= edarc 3pi2))
  92.                                                 (and (= starc 3pi2) (= edarc pi2))
  93.                                         )
  94.                                         (setq clt (cons pt10 clt))
  95.                                 )
  96.                                         (cond
  97.                                                 ((or
  98.                                                        
  99.                                                         (and (<= starc pi2) (<= pi2 edarc) (< edarc 3pi2))
  100.                                                         (and (<= pi2 edarc) (< edarc 3pi2 starc))
  101.                                                 )
  102.                                                 (setq pltud (cons (polar pt10 pi2 dr40) pltud))
  103.                                                 )
  104.                                                 ((or
  105.                                                         (and (<= starc pi2) (>= edarc 3pi2))
  106.                                                         (and (<= starc pi2) (< edarc pi2))
  107.                                                         (and (> starc 3pi2) (>= edarc 3pi2))
  108.                                                 )
  109.                                                 (setq        pltud (cons (polar pt10 pi2 dr40)
  110.                                                                                         (cons (polar pt10 3pi2 dr40) pltud)
  111.                                                                                         )
  112.                                                 )
  113.                                                 )
  114.                                                 ((<= pi2 edarc starc 3pi2)
  115.                                                         (setq        pltud (cons (polar pt10 pi2 dr40)
  116.                                                                                                 (cons (polar pt10 3pi2 dr40) pltud)
  117.                                                                                           )
  118.                                                         )
  119.                                                 )
  120.                                                 ((and
  121.                                                         (> starc pi2)
  122.                                                         (<= starc 3pi2)
  123.                                                         (or (>= edarc 3pi2) (and (>= edarc 0) (< edarc pi2)))
  124.                                                   )
  125.                                                 (setq pltud (cons (polar pt10 3pi2 dr40) pltud))
  126.                                                 )
  127.                                         )
  128.                                         (cond
  129.                                                 ((and (<= starc pi edarc) (> starc 0))
  130.                                                                 (setq pltlr (cons (polar pt10 pi dr40) pltlr))
  131.                                                 )
  132.                                                 ((<= pi edarc starc)
  133.                                                         (setq        pltlr (cons (polar pt10 0 dr40)
  134.                                                                                                 (cons (polar pt10 pi dr40) pltlr)
  135.                                                                                                 )
  136.                                                         )
  137.                                                 )
  138.                                                 ((>= pi starc edarc)
  139.                                                         (setq        pltlr (cons (polar pt10 0 dr40)
  140.                                                                                                 (cons (polar pt10 pi dr40) pltlr)
  141.                                                                                                 )
  142.                                                         )
  143.                                                 )
  144.                                                 ((< edarc pi starc)
  145.                                                         (setq pltlr (cons (polar pt10 0 dr40) pltlr))
  146.                                                 )
  147.                                         )
  148.                 )
  149.                                
  150.                                 ((= ac0 "LINE")
  151.                                         (setq pt10 (cdr (assoc 10 info)))
  152.                                         (setq pt11 (cdr (assoc 11 info)))
  153.                                         (setq plt (cons pt10 (cons pt11 plt)))
  154.                                 )
  155.                                 ((= ac0 "LWPOLYLINE")
  156.                                         (setq pt10s (vxs obj))
  157.                                         (setq plt (append pt10s plt))
  158.                                 )
  159.         );end_cond
  160.                         (setq i (1+ i))
  161. );end_repeat
  162. (setq alist (append plt pltlr pltud))
  163. (setq
  164.         alist1
  165.         (vl-sort alist
  166.                 (function (lambda (e1 e2) (< (car e1) (car e2))))
  167.         )
  168. )
  169. (setq lft (car alist1))
  170. (setq rht (car (reverse alist1)))
  171. (setq        alist2
  172.                         (vl-sort alist
  173.                                 (function (lambda (e1 e2) (> (cadr e1) (cadr e2))))
  174.                         )
  175. )
  176. (setq upt (car alist2))
  177. (setq dnt (car (reverse alist2)))
  178. (setq alist1 (mvs alist1))
  179. (setq alist2 (mvs alist2))
  180. (setq cor1 (mapcar '+
  181.                         (mapcar '* lft '(1 0 1))
  182.                         (mapcar '* upt '(0 1 1))
  183.                         )
  184. )
  185. (setq cor2 (mapcar '+
  186.                         (mapcar '* lft '(1 0 1))
  187.                         (mapcar '* dnt '(0 1 1))
  188.                         )
  189. )
  190. (setq cor3 (mapcar '+
  191.                         (mapcar '* rht '(1 0 1))
  192.                         (mapcar '* upt '(0 1 1))
  193.                 )
  194. )
  195. (setq cor4 (mapcar '+
  196.                         (mapcar '* rht '(1 0 1))
  197.                         (mapcar '* dnt '(0 1 1))
  198.                 )
  199. )
  200.                
  201. (setq pcenter (inters cor1 cor4 cor3 cor2 nil))
  202.                
  203. (setq locat (getpoint pcenter "\nProjection position:"))
  204.                
  205. (if (> (abs (- (car locat) (car pcenter)))
  206.                         (abs (- (cadr locat) (cadr pcenter)))
  207.         )
  208. (setq key 0)
  209. ;;;x dir
  210. (setq key 1)
  211. ;;;y dir
  212. )
  213.                
  214. (cond
  215.         ((= key 0)
  216.         (setq
  217.                 xcor1 (mapcar '+ cor1 '(99999 0 0))
  218.                 xcor2 (mapcar '+ cor2 '(99999 0 0))
  219.                 xcor3 (mapcar '+ cor3 '(-99999 0 0))
  220.                 xcor4 (mapcar '+ cor4 '(-99999 0 0))
  221.         )
  222.         (grdraw xcor1 xcor3 1 1)
  223.         (grdraw xcor2 xcor4 1 1)
  224.         )
  225.         ((= key 1)
  226.                 (setq
  227.                         xcor1 (mapcar '+ cor1 '(0 99999 0))
  228.                         xcor2 (mapcar '+ cor2 '(0 -99999 0))
  229.                         xcor3 (mapcar '+ cor3 '(0 99999 0))
  230.                         xcor4 (mapcar '+ cor4 '(0 -99999 0))
  231.                 )
  232.                 (grdraw xcor1 xcor2 1 1)
  233.                 (grdraw xcor3 xcor4 1 1)
  234.         )
  235. );end_cond
  236.                
  237. (cond
  238.         ((= key 0)
  239.         (setq plistn (append plt pltud))
  240.         (setq loc1  (mapcar        '+
  241.                                 (mapcar '* locat '(1 0 1))
  242.                                 (mapcar '* upt '(0 1 1))
  243.                                 )
  244.         )
  245.         (setq loc2        (mapcar        '+
  246.         (mapcar '* locat '(1 0 1))
  247.         (mapcar '* dnt '(0 1 1))
  248.                                         )
  249.         )
  250.         )
  251.         ((= key 1)
  252.                 (setq plistn (append plt pltlr))
  253.                         (setq loc1 (mapcar        '+
  254.                        (mapcar '* locat '(0 1 1))
  255.                        (mapcar '* lft '(1 0 1))
  256.                                                 )
  257.                         )
  258.                         (setq loc2 (mapcar        '+
  259.                                                 (mapcar '* locat '(0 1 1))
  260.                                                 (mapcar '* rht '(1 0 1))
  261.                                                 )
  262.                         )
  263.         )
  264. );end_cond
  265. (grdraw loc1 loc1 1 1)
  266.                
  267. (setq locat2 (getpoint locat "\nWidth:"))
  268.                 (cond
  269.                         ((= key 0)
  270.                                 (setq locn1 (mapcar '+
  271.                                         (mapcar '* locat2 '(1 0 1))
  272.                                         (mapcar '* upt '(0 1 1))
  273.                                                         )
  274.                                 )
  275.                                 (setq locn2 (mapcar '+
  276.                                         (mapcar '* locat2 '(1 0 1))
  277.                                         (mapcar '* dnt '(0 1 1))
  278.                                                         )               
  279.                                 )
  280.                                 (setq lcline0 (mapcar '(lambda (x) (mapcar '* x '(0 1 1))) plistn))
  281.                                 (if (> (car locat) (car locat2))
  282.                                         (setq clocat  locat
  283.                                                 clocat2 locat2
  284.                                         )
  285.                                         (setq clocat  locat2
  286.                                                 clocat2 locat
  287.                                         )
  288.                                 )
  289.                                 (setq lcline1
  290.                                         (mapcar
  291.                                                 '(lambda (x) (mapcar '+ x (mapcar '* locat '(1 0 1))))
  292.                                                 lcline0
  293.                                         )
  294.                                 )
  295.                                 (setq lcline2
  296.                                         (mapcar
  297.                                                 '(lambda (x) (mapcar '+ x (mapcar '* locat2 '(1 0 1))))
  298.                                                 lcline0
  299.                                         )
  300.                                 )
  301.                                 (setq celine0 (mapcar '(lambda (x) (mapcar '* x '(0 1 1))) clt))
  302.                                 (setq celine1
  303.                                         (mapcar
  304.                                                 '(lambda (x)
  305.                                                         (mapcar '+ x '(10 0 0) (mapcar '* clocat '(1 0 1)))
  306.                                                 )
  307.                                                 celine0
  308.                                         )
  309.                                 )
  310.                                 (setq
  311.                                         celine2 (mapcar '(lambda        (x)
  312.                                                 (mapcar '+
  313.                                                         x
  314.                                                         '(-10 0 0)
  315.                                                         (mapcar '* clocat2 '(1 0 1))
  316.                                                 )
  317.                                         )
  318.                                         celine0
  319.                                         )
  320.                                 )
  321.                         )
  322.                         ((= key 1)
  323.                                 (setq locn1 (mapcar '+
  324.                                         (mapcar '* locat2 '(0 1 1))
  325.                                         (mapcar '* lft '(1 0 1))
  326.                                 )
  327.                                 )
  328.                                 (setq locn2 (mapcar '+
  329.                                         (mapcar '* locat2 '(0 1 1))
  330.                                         (mapcar '* rht '(1 0 1))
  331.                                 )
  332.                                 )
  333.                                 (setq
  334.                                 lcline0 (mapcar '(lambda (x) (mapcar '* x '(1 0 1))) plistn))
  335.                                 (if (> (cadr locat) (cadr locat2))
  336.                                         (setq clocat  locat
  337.                                                 clocat2 locat2
  338.                                         )
  339.                                         (setq clocat  locat2
  340.                                                 clocat2 locat
  341.                                         )
  342.                                 )
  343.                                 (setq lcline1
  344.                                         (mapcar
  345.                                                 '(lambda (x) (mapcar '+ x (mapcar '* locat '(0 1 1))))
  346.                                                 lcline0
  347.                                         )
  348.                                 )
  349.                                 (setq lcline2
  350.                                         (mapcar
  351.                                                 '(lambda (x) (mapcar '+ x (mapcar '* locat2 '(0 1 1))))
  352.                                                 lcline0
  353.                                         )
  354.                                 )
  355.                                 (setq celine0 (mapcar '(lambda (x) (mapcar '* x '(1 0 1))) clt))
  356.                                 (setq celine1
  357.                                         (mapcar
  358.                                                 '(lambda (x)
  359.                                                         (mapcar '+ x '(0 10 0) (mapcar '* clocat '(0 1 1)))
  360.                                                 )
  361.                                                 celine0
  362.                                         )
  363.                                 )
  364.                                 (setq
  365.                                         celine2 (mapcar '(lambda        (x)
  366.                                                 (mapcar '+
  367.                                                         x
  368.                                                         '(0 -10 0)
  369.                                                         (mapcar '* clocat2 '(0 1 1))
  370.                                                 )
  371.                                         )
  372.                                         celine0
  373.                                         )
  374.                                 )
  375.                         )
  376.                 )
  377.                 (grdraw locn1 locn1 1 1)
  378.                
  379.                 (setvar "cmdecho" 0)
  380.                 (command "_.undo" "be")
  381.                 (entmake (list '(0 . "line")
  382.                         '(8 . "0")
  383.                         (cons 10 loc1)
  384.                         (cons 11 loc2)
  385.                 )
  386.                 )
  387.                 (entmake (list '(0 . "line")
  388.                         '(8 . "0")
  389.                         (cons 10 locn1)
  390.                         (cons 11 locn2)
  391.                 )
  392.                 )
  393.                
  394.                 (repeat
  395.                         (length plistn)
  396.                         (setq pt1 (car lcline1))
  397.                         (setq lcline1 (cdr lcline1))
  398.                         (setq pt2 (car lcline2))
  399.                         (setq lcline2 (cdr lcline2))
  400.                         (setq oldline (ssget "_w" pt1 pt2))
  401.                        
  402.                         (if (and (/= oldline nil) (/= (sslength oldline) 0))
  403.                                 (erases oldline)
  404.                         )
  405.                        
  406.                         (entmake (list '(0 . "line")
  407.                    '(8 . "04dashed")
  408.                    (cons 10 pt1)
  409.                    (cons 11 pt2)
  410.                         )
  411.                         )
  412.                 )
  413.                
  414.                 (repeat (length clt)
  415.                         (setq pt1 (car celine1))
  416.                         (setq celine1 (cdr celine1))
  417.                         (setq pt2 (car celine2))
  418.                         (setq celine2 (cdr celine2))
  419.                         (setq oldline (ssget "_w" pt1 pt2))
  420.                        
  421.                         (if        (and (/= oldline nil) (/= (sslength oldline) 0))
  422.                                 (erases oldline)
  423.                         )
  424.                        
  425.                         (entmake (list '(0 . "line")
  426.                                 '(8 . "03centreline")
  427.                                 (cons 10 pt1)
  428.                                 (cons 11 pt2)
  429.                         )
  430.                         )
  431.                 )
  432.                 (setq oldline (ssget "_w" loc1 locn1))
  433.                
  434.                 (if (and (/= oldline nil) (/= (sslength oldline) 0))
  435.                         (erases oldline)
  436.                 )
  437.                
  438.                 (entmake (list '(0 . "line")
  439.                         '(8 . "0")
  440.                         (cons 10 loc1)
  441.                         (cons 11 locn1)
  442.                 )
  443.                 )
  444.                 (setq oldline (ssget "_w" loc2 locn2))
  445.                
  446.                 (if (and (/= oldline nil) (/= (sslength oldline) 0))
  447.                         (erases oldline)
  448.                 )
  449.                
  450.                 (entmake (list '(0 . "line")
  451.                         '(8 . "0")
  452.                         (cons 10 loc2)
  453.                         (cons 11 locn2)
  454.                 )
  455.                 )
  456.                 (command "_.undo" "e")
  457.                 (setvar "cmdecho" 0)
  458.                 (prin1)
  459. )

预测lsp
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 19:09:51 | 显示全部楼层
要么两者都应该是虚线,要么两者都应该是连续的,或者第三个。。。从左边看,你正在投影右侧,所以根据你的判断,破折号在第一张图片上是可以的,然后你正在从顶部向下投影,这样边缘是可见的。。。你应该采取某种标准的投影方式——如果你像在动画gif上那样进行投影,那就好了,但是你应该考虑可见性问题。。。你总是这样投影简单的几何形状吗。。。如果是这种情况,那么考虑将包围盒矩形化,并将其求交为形状。。。用你的投影方式,如果点-接合盒和形状之间的交点在接合盒的左/上边缘,那么投影线应该是连续的,相反的,如果在右/下边缘,那么它应该是虚线。。。与边框矩形不相交的点总是虚线。。。因此,当构建点列表以投影列表的生成元素((x y z)“cont”)或((x y z)“dash”)时,您可以获得正确的(cadr listelement)键,根据哪个例程应确定在生成线实体时应使用何种类型的线层。。。
回复

使用道具 举报

2

主题

10

帖子

9

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 19:17:22 | 显示全部楼层
@马尔科·里巴
谢谢你的回复。看起来很复杂,超出了我的能力。
如果有人感兴趣,请帮我修改。谢谢
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 19:43:36 | 显示全部楼层
Rosamund,听着,我不能修改你的代码,但幸运的是,我的库中有一个类似的代码,我认为它比你的更好。。。我会附上我的lisp和动画gif。。。HTH,M.R。
statproj。lsp
回复

使用道具 举报

2

主题

10

帖子

9

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 19:52:39 | 显示全部楼层
 
@马尔科·里巴
 
谢谢你的支持,你的演示太小了。不能放大?
 
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-8-18 22:38 , Processed in 2.315111 second(s), 66 queries .

© 2020-2025 乐筑天下

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