乐筑天下

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

[编程交流] Lisp用于同一个中的双偏移

[复制链接]

26

主题

89

帖子

68

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
135
发表于 2022-7-5 16:56:01 | 显示全部楼层 |阅读模式
大家好。。。
我再次需要帮助。
我希望lisp在同一侧但不同距离上进行双偏移。一条线距为1.70mm,另一条线距源线为1.75mm。
175605zm064r3lynhv2xtr.jpg
 
 
提前谢谢。
回复

使用道具 举报

9

主题

55

帖子

47

银币

初来乍到

Rank: 1

铜币
45
发表于 2022-7-5 17:01:44 | 显示全部楼层
这个怎么样?您必须选择要偏移的线,然后选择要偏移的边。
 
  1. ^C^C^C(Setq OSL (Entsel "Select line to offset: "));\offset;1.70;!OSL;\;offset;1.75;!OSL;\;

 
不要忘记,您也可以使用多行来实现这一点。根据使用情况,它可能会有所帮助。
回复

使用道具 举报

26

主题

89

帖子

68

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
135
发表于 2022-7-5 17:04:28 | 显示全部楼层
你好,mwade93。。
谢谢你的宏字符串。。。。这根绳子很好用。
该字符串需要为每个操作单击工具按钮。
但我希望这个字符串一直重复到用户端。
回复

使用道具 举报

9

主题

55

帖子

47

银币

初来乍到

Rank: 1

铜币
45
发表于 2022-7-5 17:05:54 | 显示全部楼层
你想让它一次又一次地重复吗?如果是这样,您只需添加一个*字符。用户将不得不使用退出键取消它,但它将重复,直到这一点。
 
  1. *^C^C^C(Setq OSL (Entsel "Select line to offset: "));\offset;1.70;!OSL;\;offset;1.75;!OSL;\;
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 17:11:35 | 显示全部楼层
单向。
 
  1. (defun c:test (/ s p)
  2. (while (and (setq s (car (entsel "\nSelect line to offset :")))
  3.               (= (cdr (assoc 0 (entget s))) "LINE")
  4.               (setq p (getpoint "\nSpecify offset side :"))
  5.          )
  6.          (foreach x '(1.7 1.75)
  7.            (command "_.offset" x (ssadd s) "_non" p "")
  8.          )
  9.        )
  10. (princ)
  11. )
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 17:14:12 | 显示全部楼层
虽然这是我一直以来的最爱,但我可以提出如下建议:
  1. (defun C:test ( / *error* acDoc sUndo Svars R n oLst o )
  2. (defun *error* (m)
  3.         (and sUndo (vla-EndUndoMark acDoc)) (redraw)
  4.         (and Svars (mapcar 'setvar (mapcar 'car Svars) (mapcar 'cdr Svars)))
  5.         (and m (print m))
  6.         (princ)
  7. ); defun *error*
  8. (setq acDoc (vla-get-ActiveDocument (vlax-get-acad-object)))
  9. (vla-EndUndoMark acDoc) (setq sUndo (not (vla-StartUndoMark acDoc)))
  10. (setq Svars (mapcar (function (lambda (x) (cons x (getvar x)))) '("CLIPROMPTLINES" "PICKBOX" "CMDECHO")))
  11. (and Svars (mapcar 'setvar (mapcar 'car Svars) '(0 12 0)))
  12. (setvar 'errno 0) (redraw)
  13. (while (/= 52 (getvar 'errno))
  14.         (initget 128 "Distance")
  15.         (setq R (entsel (strcat "\nSpecify side to offset or [D]istance " (if oLst (vl-princ-to-string (reverse oLst)) "") " <exit>: ")))
  16.         (cond
  17.                 ((= 7 (getvar 'errno)) (princ "\nNothing selected.") (setvar 'errno 0))
  18.                 ( (= 'STR (type R))
  19.                         (while (setq n (getreal (strcat "\nSpecify offset value from the curve " (if oLst (vl-princ-to-string (reverse oLst)) "") " <enter>: ")))
  20.                                 (princ (strcat "\nOffset values: " (vl-princ-to-string (reverse (setq oLst (cons n oLst))))))
  21.                         )
  22.                         (setq oLst (reverse oLst))
  23.                 )
  24.                 ((and (vl-consp R) (eq 'ENAME (type (car R))) (setq o (vlax-ename->vla-object (car R))) (not (vlax-method-applicable-p o 'Offset)))
  25.                         (princ "\nThis object can not be offseted.") (setq o nil)
  26.                 )
  27.                 ((and o (eq (vla-get-Lock (vla-item (vla-get-Layers acDoc) (vla-get-Layer o))) :vlax-true))
  28.                         (princ "\nThis object is on a locked layer.") (setq o nil)
  29.                 )
  30.                 ((and o (not oLst))
  31.                         (grdraw (cadr R) (vlax-curve-getClosestPointTo o (cadr R)) 1 7)
  32.                         (while (setq n (getreal (strcat "\nSpecify offset value from the curve " (if oLst (vl-princ-to-string (reverse oLst)) "") " <enter>: ")))
  33.                                 (princ (strcat "\nOffset values: " (vl-princ-to-string (reverse (setq oLst (cons n oLst))))))
  34.                         )
  35.                         (and (vl-consp oLst) (apply 'and (mapcar 'numberp oLst)) (setvar 'errno 52))
  36.                 )
  37.                 ( (and o (vl-consp oLst) (apply 'and (mapcar 'numberp oLst))) (setvar 'errno 52) )
  38.                 (T nil)
  39.         ); cond       
  40. ); while
  41. (foreach x oLst (command "_.OFFSET" x (car R) "_non" (cadr R) "E") ); (vla-Offset o x)
  42. (and sUndo (vla-EndUndoMark acDoc))
  43. (and Svars (mapcar 'setvar (mapcar 'car Svars) (mapcar 'cdr Svars)))
  44. (redraw) (princ)
  45. );| defun |; (vl-load-com) (princ)
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 17:15:22 | 显示全部楼层
正如您在2014年看到的那样,这是一种通过命令行see for image生成多个偏移的简单方法http://www.cadtutor.net/forum/showthread.php?84919-绘制双多段线/第2页
 
  1. ; multiple pline including width & col function
  2. ; single entry is offset only use +ve or -ve numbers for left and right
  3. ; two values 3,1 means offset 3 with width 1
  4. ; three values 3,2,1 means offset 3 with start width 2 end 1
  5. ; by Alan H March 2014
  6. ; thanks to Lee-mac for this defun
  7. (defun _csv->lst ( str / pos )
  8. (if (setq pos (vl-string-position 44 str))
  9.    (cons (substr str 1 pos) (_csv->lst (substr str (+ pos 2))))
  10.    (list str)
  11.    )
  12. )
  13. (defun aH:multpl ( / pt1 pt2 pt3 obj1 obj2 dist1 pwidst plcol lst howmany)
  14. (setvar "PLINEWID" 0) ;set PL width to 0
  15. (command "_pline")
  16. (while (= (getvar "cmdactive") 1 ) (command pause)
  17. )
  18. (setq pt1 nil)
  19. (setq obj1 (entlast)) ; grab pline
  20. (setq pt1 (getvar "lastpoint")) ; last pt
  21. (command "circle" pt1 100.0) ; do something smart here like screen scale for circle
  22. (setq obj2  (entlast)) ;grab circle
  23. (setq pt2 (vlax-invoke (vlax-ename->vla-object obj1) 'intersectWith (vlax-ename->vla-object obj2) acextendnone)); find int point
  24. (setq ang (angle pt1 pt2)) ;angle of pline now know left right
  25. (command "erase" "last" "") ; remove circle
  26. (while (/= (setq offval (getstring "Enter offset distance -ve for left")) "")
  27. (setq lst (cons (_csv->lst offval) lst))
  28. (setq howmany (length (nth 0 lst))) ;determines single or multi answer
  29. (if (= howmany 1)(setq dist1 (atof (nth 0 (nth 0 lst)))) )
  30. (if (= howmany 2)
  31.   (progn
  32.   (setq dist1 (atof (nth 0 (nth 0 lst))))
  33.   (setq pwidst (atof (nth 1 (nth 0 lst))))
  34.   ) ; progn
  35. ); if
  36. (if (= howmany 3)
  37.   (progn
  38.   (setq dist1 (atof (nth 0 (nth 0 lst))))
  39.   (setq pwidst (atof (nth 1 (nth 0 lst))))
  40.   (setq pLcol (atof (nth 2 (nth 0 lst))))
  41.   ) ; progn
  42. ); if
  43. (if (> dist1 0.0)
  44. (setq pt3 (polar pt2 (+ ang (/ pi 2.0)) (abs dist1)))
  45. (setq pt3 (polar pt2 (- ang (/ pi 2.0)) (abs dist1)))
  46. )
  47. (command "offset" (abs dist1) obj1 pt3 "")
  48. (if (>= howmany 2)
  49. (vla-put-ConstantWidth (vlax-ename->vla-object (entlast)) pwidst)
  50. )
  51. (if (= howmany 3)
  52. (vla-put-color (vlax-ename->vla-object (entlast)) plcol) ; note color as a number
  53. )
  54. ) ; end while
  55. (command "erase" obj1 "")
  56. ) ; end defun
  57. (AH:multpl)
  58. (princ)
回复

使用道具 举报

24

主题

141

帖子

115

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
123
发表于 2022-7-5 17:20:27 | 显示全部楼层
您好,Grrr,
遗憾的是,该Lisp在Acad 2017中不起作用。我认为命令移动的执行方式不同。
他们可以再检查一下吗?
非常感谢。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 17:21:29 | 显示全部楼层
 
呜呜,对不起,我不知道。
听起来我想重新发明轮子,但对我来说重要的是编码实践/经验。
 
 
 
嗨,Martinel
我建议调用offset命令并检查以下步骤:
  1. (setq e (car (entsel)))
  2. (setq p (getpoint))
  3. (command "_.OFFSET" 500 e "_non" p "E") ; offset the entity "e" on 500 units distance, oriented on the "p" side

这在ACAD2015中有效。
回复

使用道具 举报

24

主题

141

帖子

115

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
123
发表于 2022-7-5 17:24:51 | 显示全部楼层
嗨,Grrr
 
 
命令:(setq e(car(entsel)))
 
选择对象:
 
命令:(setq p(getpoint))
(1443.23 2158.93 0.0)
 
命令:(命令“_.OFFSET”500 e“\u non”p“e”)
_.抵消
当前设置:Delete source=No Layer=source OFFSETGAPTYPE=0
指定距离或[通过点(T)/删除(D)/图层(L)]:500
选择要移动的对象,或[退出/撤消]:
指定页面上要移动到的点,或[退出/重复/撤消]:
选择要移动的对象或[退出(E)/撤消(U)]:E
 
*无效的选择*
需要一个点或出口
; 错误:函数中止
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 13:35 , Processed in 0.611684 second(s), 75 queries .

© 2020-2025 乐筑天下

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