乐筑天下

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

[编程交流] 如何偏移多个多段线

[复制链接]

42

主题

173

帖子

132

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
220
发表于 2022-7-5 16:20:46 | 显示全部楼层 |阅读模式
大家好。。。
我在寻找解决这个问题的方法
 
我有一个lisp,它将多个块连接到图形中的一个基块
... 它将绘制多段线,如所附图像中的“before”所示
 
生成的多段线将在基点处重合。。。
所以我想按there dist=(Xn-X0)距离对这些多段线进行排序
因此,距离越小的多段线偏移越高,以此类推。。。
 
只有重合段将偏移。。。X1到Xn将保留其位置
有什么建议吗?
 
提前谢谢你
172047jakepvec3c6668x3.jpg
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 16:40:23 | 显示全部楼层
如果您使用ssget“F”围栏选项并拖动垂直线,它将以正确的顺序选择它们,那么获得订单是很容易的。
 
  1. (setq lst (list (getpoint"pick left") (getpoint "Pick Right"))) ; pick left and right
  2. (setq ss (ssget "f" lst)) ; make selection set
  3. (setq obj (ssname ss x)) ; x starts at 0 and is (- (sslength ss) 1) long

 
在我看来,是向下偏移PLINE,然后重置最后的垂直Y值。我现在没有任何东西,所以稍后可能会发布。
回复

使用道具 举报

42

主题

173

帖子

132

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
220
发表于 2022-7-5 16:53:31 | 显示全部楼层
iam正在修改此lisp
  1. Copyright(c)2005-2011 Version 3.0(US)
  2.   Tom Davis (tdavis@metzgerwillard.com)
  3. ;------------------------------------------------------------------------------
  4. (defun c:reverse ( / oldecho oldsnap ent e etyp)
  5. ;reverse text, line, arc, circle, ellipse, spline, or polyline
  6. (setq oldecho (getvar "cmdecho")
  7.        oldsnap (getvar "osmode")
  8. )
  9. (setvar "cmdecho" 0)                                           ;turn off echo
  10. (if (< oldsnap 16384) (setvar "osmode" (+ oldsnap 16384)))     ;turn off osnap
  11. (command "_select" "")                                         ;deselect all
  12. (while (setq ent (nentsel "\nSelect reversible object: "))
  13.    (setq e    (car ent)
  14.          etyp (cdr (assoc 0 (entget e)))
  15.    )
  16.    ;exclude block components that are neither text nor hatching
  17.    (if (or (< (length ent) 4)(= etyp "TEXT")(= etyp "MTEXT")(= etyp "HATCH"))
  18.      (progn
  19.        (while (= (cdr (assoc 0 (entget e))) "VERTEX")           ;skip vertices
  20.          (setq e (entnext e))
  21.        )
  22.        (if (= (cdr (assoc 0 (entget e))) "SEQEND")              ;get hwpolyline
  23.          (setq e (cdr (assoc -2 (entget e))))                   ;    or ellipse
  24.        )
  25.        (setq etyp (cdr (assoc 0 (entget e))))
  26.        (princ etyp)
  27.        (command "_undo" "_begin")
  28.        (cond
  29.          ((= etyp "LWPOLYLINE")(revlwpline e))
  30.          ((= etyp "POLYLINE")  (revhwpline e))
  31.          ((= etyp "LINE")      (revline    e))
  32.          ((= etyp "ARC")       (revarc     e))
  33.          ((= etyp "CIRCLE")    (revcircle  e))
  34.          ((= etyp "HATCH")     (revhatch   e))
  35.          ((= etyp "ELLIPSE")   (revellipse e))
  36.          ((= etyp "MTEXT")     (revmtext   e))
  37.          ((= etyp "TEXT")      (revtext    e etyp))
  38.          ((= etyp "ATTRIB")    (revtext    e etyp) (entupd e))
  39.          ((= etyp "RTEXT")     (revrtext   e))
  40.          ((= etyp "SPLINE")    (command "_splinedit" e "_e" ""))
  41.        )
  42.        (if (> (length ent) 3)(entupd (car (cadddr ent))))       ;block text
  43.                                                                 ;or hatching
  44.        (command "_undo" "_end")
  45.      )
  46.      (princ "INSERT")
  47.    )
  48. )
  49. (setvar "cmdecho" oldecho)
  50. (setvar "osmode"  oldsnap)
  51. (princ)
  52. )
  53. ;------------------------------------------------------------------------------
  54. ;LWPOLYLINE
  55. (defun revlwpline (e / footer done vertices header flag)
  56. ;reverse lightweight polyline
  57. (foreach item (reverse (entget e))
  58.    (cond
  59.      ((not done)
  60.        (cond
  61.          ((= (car item) 40)
  62.            (setq footer (cons (cons 41 (cdr item)) footer)      ;swap width
  63.                  done t
  64.            )
  65.          )
  66.          ((= (car item) 41)
  67.            (setq footer (cons (cons 40 (cdr item)) footer))     ;swap width
  68.          )
  69.          ((= (car item) 42)
  70.            (setq footer (cons (cons 42 (- (cdr item))) footer)) ;negate bulge
  71.          )
  72.          ((= (car item) 210)
  73.            (setq footer (cons item footer))
  74.          )
  75.        )
  76.      )
  77.      ((= (car item) 10)
  78.        (setq vertices (cons item vertices))
  79.      )
  80.      ((= (car item) 40)
  81.        (setq vertices (cons (cons 41 (cdr item)) vertices))     ;swap width
  82.      )
  83.      ((= (car item) 41)
  84.        (setq vertices (cons (cons 40 (cdr item)) vertices))     ;swap width
  85.      )
  86.      ((= (car item) 42)
  87.        (setq vertices (cons (cons 42 (- (cdr item))) vertices)) ;negate bulge
  88.      )
  89.      (t (setq header (cons item header)))
  90.    )
  91. )
  92. (setq flag (assoc 70 header))
  93. (if (< (cdr flag) 128)                 ;turn on linetype generation
  94.    (setq header (subst (cons 70 (+ (cdr flag) 128)) flag header))
  95. )
  96. (entmod (append header (reverse vertices) footer))
  97. )
  98. ;------------------------------------------------------------------------------
  99. ;POLYLINE
  100. (defun revhwpline (e / oldname old ent1 buldge end start ent tangent radians
  101.                       vertex vertices flag)
  102. ;reverse heavyweight polyline
  103. (setq oldname  e
  104.        old   (entget oldname)
  105.        e     (entnext e)
  106.        ent1  (entget e)                 ;get first vertex
  107.        bulge (cdr (assoc 42 ent1))
  108.        end   (cdr (assoc 41 ent1))
  109.        start (cdr (assoc 40 ent1))
  110.        e     (entnext e)
  111.        ent   (entget e)                 ;get second vertex
  112. )
  113. (while (= (cdr (assoc 0 ent)) "VERTEX")
  114.    (if (= (logand (cdr (assoc 70 ent)) 2) 2)
  115.      (setq tangent (assoc 50 ent)
  116.            radians (- (cdr tangent) pi) ;reverse tangent
  117.            ent     (subst (cons 50 radians) tangent ent)
  118.      )
  119.    )
  120.    (setq vertex   (subst (cons 42 (- bulge))(assoc 42 ent) ent)    ;negate bulge
  121.          vertex   (subst (cons 41 start)    (assoc 41 ent) vertex) ;swap width
  122.          vertex   (subst (cons 40 end)      (assoc 40 ent) vertex) ;swap width
  123.          bulge    (cdr  (assoc 42 ent))
  124.          end      (cdr  (assoc 41 ent))
  125.          start    (cdr  (assoc 40 ent))
  126.          vertices (cons vertex vertices)
  127.          e        (entnext e)
  128.          ent      (entget e)            ;get next vertex or seqend
  129.    )
  130. )
  131. (setq flag (assoc 70 old))
  132. (if (< (cdr flag) 128)                 ;turn on linetype generation
  133.    (setq old (subst (cons 70 (+ (cdr flag) 128)) flag old))
  134. )
  135. (entmake old)                          ;make new polyline
  136. (foreach ent vertices (entmake ent))   ;make new vertices
  137. (if (= (logand (cdr (assoc 70 ent1)) 2) 2)
  138.    (setq tangent (assoc 50 ent1)
  139.          radians (- (cdr tangent) pi)   ;reverse tangent
  140.          ent1    (subst (cons 50 radians) tangent ent1)
  141.    )
  142. )
  143. (setq ent1 (subst (cons 42 (- bulge))(assoc 42 ent1) ent1) ;negate bulge
  144.        ent1 (subst (cons 41 start)    (assoc 41 ent1) ent1) ;swap width
  145.        ent1 (subst (cons 40 end)      (assoc 40 ent1) ent1) ;swap width
  146. )
  147. (entmake ent1)                         ;make last new vertex
  148. (entmake ent)                          ;make new seqend
  149. (entdel oldname)                       ;delete old polyline
  150. )
  151. ;------------------------------------------------------------------------------
  152. ;LINE
  153. (defun revline (e / ent start end)
  154. ;reverse line
  155. (setq ent   (entget e)
  156.        start (assoc 10 ent)
  157.        end   (assoc 11 ent)             ;swap line endpoints
  158.        ent   (subst (cons 10 (cdr end)) start ent)
  159.        ent   (subst (cons 11 (cdr start)) end ent)
  160. )
  161. (entmod ent)
  162. )
  163. ;------------------------------------------------------------------------------
  164. ;ARC
  165. (defun revarc (e)
  166. ;reverse arc
  167. (command "_pedit" e "_y" "_l" "_on" "");turn arc into polyline
  168. (setq e (entlast))
  169. (if (> (getvar "plinetype") 0)
  170.    (revlwpline e)
  171.    (revhwpline e)
  172. )
  173. )
  174. ;------------------------------------------------------------------------------
  175. ;CIRCLE
  176. (defun revcircle (e / ent radius center pt1 pt2)
  177. ;reverse circle
  178. (setq ent    (entget e)
  179.        radius (cdr (assoc 40 ent))
  180.        center (cdr (assoc 10 ent))
  181.        pt1    (mapcar '+ center (list radius 0 0))
  182.        pt2    (mapcar '- center (list radius 0 0))
  183. )
  184. (command "_break" e pt1 pt2)                ;turn circle into semicircle
  185. (command "_pedit" e "_y" "_l" "_on" "_c" "");turn semicircle into closed polyline
  186. (setq e (entlast))
  187. (if (> (getvar "plinetype") 0)
  188.    (revlwpline e)
  189.    (revhwpline e)
  190. )
  191. )
  192. ;------------------------------------------------------------------------------
  193. ;HATCH
  194. (defun revhatch (e / ent solid item ang pi2 new y)
  195. ;reverse hatch
  196. (setq ent   (entget e)
  197.        solid (cdr (assoc 70 ent))                   ;solid fill flag
  198.        pi2   (* 2 pi)
  199. )
  200. (cond
  201.    ((= solid 0)                                     ;pattern fill
  202.      (foreach item (reverse ent)
  203.        (cond
  204.          ((or (= (car item) 52) (= (car item) 53))  ;pattern or line angle
  205.            (setq ang (+ (* pi 0.5) (cdr item)))     ;rotate 90°
  206.            (if (>= ang pi2) (setq ang (- ang pi2))) ;normalize angle
  207.            (setq new (cons (cons (car item) ang) new))
  208.          )
  209.          ((or (= (car item) 43) (= (car item) 45))  ;line origin or offset x
  210.            ;rotate line origin or offset 90°: new y = old x; new x = - old y
  211.            (setq new (cons (cons (1+ (car item)) (cdr item)) new)
  212.                  new (cons (cons (car item) (- y)) new))
  213.          )
  214.          ((or (= (car item) 44) (= (car item) 46))  ;line origin or offset y
  215.            (setq y (cdr item))
  216.          )
  217.          (t (setq new (cons item new)))
  218.        )
  219.      )
  220.      (entmod new)
  221.    )
  222.    ((= solid 1)                                     ;solid fill
  223.      (if (= (cdr (assoc 450 ent)) 1)                ;gradient fill
  224.        (progn
  225.          (setq item (assoc 460 ent)                 ;gradient angle
  226.                ang  (+ pi (cdr item))               ;rotate 180°
  227.          )
  228.          (if (>= ang pi2) (setq ang (- ang pi2)))   ;normalize angle
  229.          (setq ent (subst (cons 460 ang) item ent))
  230.          (entmod ent)
  231.        )
  232.      )
  233.    )
  234. )
  235. )
  236. ;------------------------------------------------------------------------------
  237. ;RTEXT
  238. (defun revrtext (e / ent ins w h rot ang hd vd new)
  239. ;reverse rtext
  240. (command "_explode" e)                         ;explode rtext into mtext
  241. (setq ent  (entget (entlast))                  ;get mtext
  242.        w    (cdr (assoc 42 ent))                ;width
  243.        h    (cdr (assoc 43 ent))                ;height
  244. )
  245. (command "_undo" 1)
  246. (setq ent  (entget e)                          ;get rtext
  247.        ins  (assoc 10 ent)                      ;insertion point
  248.        rot  (assoc 50 ent)                      ;rotation
  249.        ang  (cdr rot)
  250.        hd   (polar '(0 0 0)    ang           w) ;horizontal displacement
  251.        vd   (polar '(0 0 0) (- ang (/ pi 2)) h) ;vertical displacement
  252.        new  (mapcar '+ (cdr ins) hd vd)         ;new insertion point
  253.        ang  (rem (+ ang pi) (* 2 pi))           ;normalize angle
  254.        ent  (subst (cons 50 ang) rot ent)       ;reverse direction
  255.        ent  (subst (cons 10 new) ins ent)       ;set new insertion point
  256. )
  257. (entmod ent)
  258. )
  259. ;------------------------------------------------------------------------------
  260. ;TEXT or ATTRIB
  261. (defun revtext (e etyp / vc ent box hj vj rot ang p1 p2 h w
  262.                         dist phi hd vd new gf gfs sn p s done)
  263. ;reverse text or attribute
  264. (if (= etyp "TEXT")
  265.    (setq vc 73) ;text
  266.    (setq vc 74) ;attribute
  267. )
  268. (setq ent (entget e)
  269.        box (textbox ent)                              ;((x1 y1 z1)(x2 y2 z2))
  270.        gf  (cdr (assoc 71 ent))                       ;generation flag
  271.        sn  (cdr (assoc  7 ent))                       ;style name
  272.        hj  (cdr (assoc 72 ent))                       ;horizontal justification
  273.        vj  (cdr (assoc vc ent))                       ;vertical justification
  274.        rot (assoc 50 ent)                             ;rotation
  275.        ang (cdr rot)                                  ;angle
  276.        p1  (assoc 10 ent)                             ;first  alignment point
  277.        p2  (assoc 11 ent)                             ;second alignment point
  278.        h   (cdr (assoc 40 ent))                       ;displacement height
  279.        p   1                                          ;rewind pointer
  280. )
  281. (while (not done)                      ;traverse style table
  282.    (setq s   (tblnext "Style" p)
  283.          p   nil                        ;reset pointer
  284.    )
  285.    (if (= sn (cdr (assoc 2 s)))         ;find style name
  286.      (progn
  287.        (setq done t
  288.              gfs  (cdr (assoc 71 s))    ;style generation flag
  289.        )
  290.        (if (= (logand (cdr (assoc 70 s)) 4) 4)
  291.          (setq gf (1+ gf))              ;vertical
  292.        )
  293.      )
  294.    )
  295. )
  296. (if  (= gfs (logand gf gfs)) ;exclude conflicting generation flags
  297.    (progn
  298.      (cond                                            ;displacement width
  299.        ((= hj 0)                        ;left
  300.          (setq w (+ (caadr box) (caar box)))
  301.        )
  302.        (t                               ;otherwise
  303.          (setq dist (distance (cdr p1) (cdr p2))
  304.                phi  (angle    (cdr p1) (cdr p2))
  305.                dist (abs (* dist (cos (- phi ang))))
  306.          )
  307.          (if (= (logand gf 2) 2) (setq dist (- dist)))       ;backward
  308.          (if (or (= hj 5) (= hj 3))
  309.            (setq w (-(+ (caar box) (caadr box))      dist))  ;fit or aligned
  310.            (setq w (-(+ (caar box) (caadr box)) (* 2 dist))) ;right, center, middle
  311.          )
  312.        )
  313.      )
  314.      (if (= vj 1)                       ;bottom
  315.        (setq dist (distance (cdr p1) (cdr p2))
  316.              phi  (angle    (cdr p1) (cdr p2))
  317.              dist (abs(* dist (sin (- phi ang))))     ;descender depth
  318.              h    (+ h (* 2 dist))
  319.        )
  320.      )
  321.      (if (= (logand gf 1) 1)            ;vertical
  322.        (cond
  323.          ((or (> hj 2) (= hj 1))                      ;center,aligned,middle,fit
  324.            (setq h 0)
  325.          )
  326.          (t                                           ;otherwise
  327.            (setq h (- (cadadr box) (cadar box)))
  328.            (if (= (+ hj vj) 0) (setq h (- h)))        ;baseline left
  329.            (cond
  330.              ((and (= hj 0) (> vj 0)) (setq vj 3))    ;bottom,middle,top left
  331.              ((= hj 2) (setq vj 0))                   ;right
  332.            )
  333.          )
  334.        )
  335.      )
  336.      (if (= (logand gf 4) 4) (setq h (- h)))          ;upside down
  337.      (setq hd   (polar '(0 0 0)    ang           w)   ;horizontal displacement
  338.            vd   (polar '(0 0 0) (+ ang (/ pi 2)) h)   ;vertical displacement
  339.      )
  340.      (cond                              ;compute new alignment point
  341.        ((or (and (= vj 0) (= hj 1))     ;center
  342.             (and (= vj 0) (= hj 2))     ;right
  343.             (= vj 1))                   ;bottom
  344.          (setq new (mapcar '+ (cdr p2) hd vd))
  345.        )
  346.        ((or (= vj 2) (= hj 4))          ;middle
  347.          (setq new (mapcar '+ (cdr p2) hd))
  348.        )
  349.        ((= vj 3)                        ;top
  350.          (setq new (mapcar '+ (cdr p2) hd)
  351.                new (mapcar '- new vd)
  352.          )
  353.        )
  354.      )
  355.      (cond
  356.        ((= (+ hj vj) 0)                 ;left
  357.          (setq new (mapcar '+ (cdr p1) hd vd)
  358.                ent (subst (cons 10 new) p1 ent)         ;set new alignment point
  359.                ent (subst (cons 50 (+ ang pi)) rot ent) ;reverse direction
  360.          )
  361.        )
  362.        ((or (= hj 5) (= hj 3))          ;fit or aligned
  363.          (setq new (mapcar '+ (cdr p2) vd hd)
  364.                ent (subst (cons 10 new) p1 ent)         ;swap alignment points
  365.                new (mapcar '+ (cdr p1) vd hd)
  366.                ent (subst (cons 11 new) p2 ent)
  367.          )
  368.        )
  369.        (t
  370.          (setq ent (subst (cons 11 new) p2 ent)         ;set new alignment point
  371.                ent (subst (cons 50 (+ ang pi)) rot ent) ;reverse direction
  372.          )
  373.        )
  374.      )
  375.      (entmod ent)
  376.    )
  377.    (alert (strcat "The selected text object is not compatible with\n"
  378.                   "its text style.  When the text style is upside\n"
  379.                   "down or backwards, the text object should also    \n"
  380.                   "be upside down or backwards."))
  381. )
  382. )
  383. ;------------------------------------------------------------------------------
  384. ;MTEXT (including dimension text)
  385. (defun revmtext (e / ent ins w h just lss ls ch rot hd vd new)
  386. ;reverse mtext or dimension text
  387. (setq ent  (entget e)
  388.        ins  (assoc 10 ent)              ;insertion point
  389.        w    (cdr (assoc 42 ent))        ;width
  390.        h    (cdr (assoc 43 ent))        ;displacement height
  391.        just (cdr (assoc 71 ent))        ;justification
  392.        rot  (assoc 50 ent)              ;rotation
  393.        lss  (cdr (assoc 73 ent))        ;line spacing style
  394.        ch   (cdr (assoc 40 ent))        ;character height
  395.        ls   (/ ch 3)                    ;interline half-space
  396.       ;ls = (5 ch/3 - ch)/2 = ch/3
  397. )
  398. (cond
  399.    ((and (= lss 2) (> just 6))          ;exact bottom
  400.      (setq h (+ h ls))
  401.    )
  402.    ((and (= lss 2) (< just 4))          ;exact top
  403.      (setq h (- h ls))
  404.    )
  405.    ((= lss 2)                           ;exact middle
  406.      (setq h ls)
  407.    )
  408.    ((and (> just 3) (< just 7))         ;at least middle
  409.      (setq h 0)
  410.    )
  411. )
  412. (setq hd   (polar '(0 0 0)    (cdr rot)           w) ;horizontal displacement
  413.        vd   (polar '(0 0 0) (- (cdr rot) (/ pi 2)) h) ;vertical displacement
  414. )
  415. (cond                                  ;compute new insertion point
  416.    ((= just 1)                          ;top left
  417.      (setq new (mapcar '+ (cdr ins) hd vd))
  418.    )
  419.    ((= just 2)                          ;top center
  420.      (setq new (mapcar '+ (cdr ins) vd))
  421.    )
  422.    ((= just 3)                          ;top right
  423.      (setq new (mapcar '- (cdr ins) hd)
  424.            new (mapcar '+ new vd)
  425.      )
  426.    )
  427.    ((= just 4)                          ;middle left
  428.      (setq new (mapcar '+ (cdr ins) hd)
  429.            new (mapcar '- new vd)
  430.      )
  431.    )
  432.    ((= just 5)                          ;middle center
  433.      (setq new (mapcar '- (cdr ins) vd))
  434.    )
  435.    ((= just 6)                          ;middle right
  436.      (setq new (mapcar '- (cdr ins) hd vd))
  437.    )
  438.    ((= just 7)                          ;bottom left
  439.      (setq new (mapcar '+ (cdr ins) hd)
  440.            new (mapcar '- new vd)
  441.      )
  442.    )
  443.    ((= just                           ;bottom center
  444.      (setq new (mapcar '- (cdr ins) vd))
  445.    )
  446.    ((= just 9)                          ;bottom right
  447.      (setq new (mapcar '- (cdr ins) hd vd))
  448.    )
  449. )
  450. (setq ent (subst (cons 10 new) ins ent)              ;set new insertion point
  451.        ent (subst (cons 50 (+ (cdr rot) pi)) rot ent) ;reverse direction
  452. )
  453. (entmod ent)
  454. )
  455. ;------------------------------------------------------------------------------
  456. ;ELLIPSE
  457. (defun revellipse (e / old oldent center p1 ratio start end major a b rot
  458.                       minor inc tol 2pi i j phi closed p tan ent flag)
  459. ;reverse ellipse
  460. (setq old    e
  461.        oldent (entget old)
  462.        center (cdr (assoc 10 oldent))
  463.        p1     (cdr (assoc 11 oldent))
  464.        ratio  (cdr (assoc 40 oldent))
  465.        start  (cdr (assoc 41 oldent))
  466.        end    (cdr (assoc 42 oldent))
  467.        major  (mapcar '+ center p1)
  468.        a      (distance center major)
  469.        b      (* ratio a)
  470.        rot    (angle center major)
  471.        minor  (polar center (+ rot (/ pi 2)) b)
  472. )
  473. (setq inc 64                           ;number of vertices on full ellipse
  474.        tol 1e-5                         ;closure tolerance
  475.        2pi (* 2 pi)
  476.        i   (1+ (fix (+ (* (/ inc 2pi) start) 0.5))) ;start index
  477.        j       (fix (+ (* (/ inc 2pi)   end) 0.5))  ;end index
  478.        phi (list start)
  479. )
  480. (while (< i j)                         ;build parameter list
  481.    (setq phi (cons (* (/ 2pi inc) i) phi)
  482.          i   (1+ i)
  483.    )
  484. )
  485. (if (and (< start tol) (< (abs (- end 2pi)) tol))
  486.    (setq closed t)
  487.    (setq closed nil
  488.          phi    (cons end phi)
  489.    )
  490. )
  491. ;parametric ellipse in object coordinate system
  492. ;  x = a cos(q);  y = b sin(q);  r = b/a
  493. ;  dx/dq = -a sin(q);  dy/dq = b cos(q)
  494. ;  dy/dx = -b/a cot(q) = -r^2 x/y
  495. ;  tangent direction = atan(dy/dx)
  496. (setq p   (mapcar '(lambda (q)         ;compute OCS points on ellipse
  497.                       (list (* a (cos q)) (* b (sin q)))
  498.                     )
  499.                     phi
  500.            )
  501.        tan (mapcar '(lambda (q)         ;compute WCS tangent directions
  502.                       (+ (atan (* (- (expt ratio 2)) (car q)) (cadr q)) rot)
  503.                     )
  504.                     p
  505.            )
  506. )
  507. (command "_ucs" "_n" 3 center major minor)         ;create OCS
  508. (setq p (mapcar '(lambda (q)(trans q 1 0)) p))     ;transform from OCS to WCS
  509. (command "_ucs" "_p")                              ;restore UCS
  510. (command "_pline")
  511. (mapcar 'command p)
  512. (command "")
  513. (command "_matchprop" old (entlast) "")
  514. (if closed
  515.    (command "_pedit" (entlast) "_l" "_on" "_c" "_f" "");force hwpline creation
  516.    (command "_pedit" (entlast) "_l" "_on"      "_f" "")
  517. )
  518. (setq e   (entnext (entlast))
  519.        ent (entget e)                   ;get first vertex
  520.        i   0
  521. )
  522. (while (= (cdr (assoc 0 ent)) "VERTEX")
  523.    (setq flag (assoc 70 ent))
  524.    (if (/= (logand (cdr flag) 1) 1)     ;skip curve fitting vertices
  525.      (progn                             ;set tangent and flag bit
  526.        (setq ent (subst (cons 50 (nth i tan)) (assoc 50 ent) ent)
  527.              i   (1+ i)
  528.              ent (subst (cons 70 (+ (cdr flag) 2)) flag ent)
  529.        )
  530.        (entmod ent)
  531.      )
  532.    )
  533.    (setq e   (entnext e)
  534.          ent (entget e)                 ;get next vertex or seqend
  535.    )
  536. )
  537. (command "_pedit" (entlast) "_f" "")   ;update fit
  538. (entdel old)                           ;delete ellipse
  539. )
  540. (princ)

 
帮助我达到我的目标。。。。你能帮我修改一下吗?这样它就可以接受另一个lisp中的选择集了
我使用“SS1”获得这些多段线的选择集
 
  1.                     (setq bbx (LM:blockboundingbox (vlax-ename->vla-object ss0)))
  2.                    (setq ss1
  3.                        (ssget "_C"
  4.                            (trans (car   bbx) 0 1)
  5.                            (trans (caddr bbx) 0 1)
  6.                           '((0 . "ARC,ELLIPSE,CIRCLE,LINE,XLINE,SPLINE,*POLYLINE"))
  7.                        )
  8.                    )

 
而Tom Davis创建的lisp使用(命令“_select”“”)和nentsel
 
这只是我学习lisp语言的第一步
提前感谢
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 17:01:53 | 显示全部楼层
我的要短得多,请测试它似乎对我有效只有1个bug pline必须从左到右。但这是可以解决的。
  1. ; adjust pline vertical only and maintain last point
  2. ; By Alan H
  3. (defun c:test ( / x newpts obj j yval incy)
  4. (setq incy (getreal "enter offset +ve or -ve"))
  5. (setq pt1 (getpoint "pick 1st point"))
  6. (setq lst (list pt1 (getpoint pt1 "get 2ndpoint")))
  7. (setq ss (ssget "F" lst))
  8. (setq yval 0)
  9. (repeat (setq k (sslength ss))
  10. (setq yval (+ incy yval))
  11. (setq obj (vlax-ename->vla-object (ssname ss (setq k (- k 1)))))
  12. (setq pts (vlax-get obj 'coordinates))
  13. (setq newpts '())
  14. (setq x 0)
  15. (repeat (- (/ (length pts) 2) 1)
  16. (setq newpts (cons (nth x pts) newpts))
  17. (setq newpts (cons (+ yval (nth (+ x 1) pts)) newpts))
  18. (setq x (+ x 2))
  19. )
  20. (setq newpts (cons (nth x pts) newpts))
  21. (setq newpts (cons (nth (+ x 1) pts) newpts))
  22. (vlax-put obj 'coordinates (reverse newpts))
  23. )
  24. )
回复

使用道具 举报

42

主题

173

帖子

132

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
220
发表于 2022-7-5 17:14:17 | 显示全部楼层
 
... 这是我达到目标的一个好策略。。。
如果你能修复错误的折线,这将是伟大的。。。无论如何,谢谢你的时间和Lisp程序
谢谢BIGAL先生
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 17:23:12 | 显示全部楼层
pline方向的解决方案可能需要额外的拾取点,或者可能使用pt1来比较起点和终点到点1的距离,因此如果终点较短,则在pline上使用反向,并可能重新进行选择集。如果你运行lisp,其中一个出现错误,做一个撤销“U”直到回到原来的位置,在出现错误的pline/s上做一个“反转”,然后再做一次,一切都应该是好的。
 
  1. ; a sample reverse pts check swap start and end
  2. (setq d1 (distance pt1 pt3))
  3. (setq d2 (distance pt2 pt3))
  4. (if (> d1 d2)
  5. (progn
  6. (setq temp pt1)
  7. (setq pt1 pt2)
  8. (setq pt2 temp)
  9. )
  10. )
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-13 23:04 , Processed in 0.594831 second(s), 67 queries .

© 2020-2025 乐筑天下

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