乐筑天下

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

[编程交流] 偏移到特定图层

[复制链接]

33

主题

117

帖子

85

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
170
发表于 2022-7-6 07:24:37 | 显示全部楼层 |阅读模式
你好
 
需要这个例程的帮助,它会偏移到选定的层,但是我需要添加编码来删除它偏移的原始对象。
 
编码如下所示:
 
  1. [/b]
  2. ;; OL.lsp
  3. ;; Offset-to-Layer = Offset an entity a specified distance, and Change the new entity to a specified Layer.
  4. ;; At first use, offers current Offset Distance and current Layer as defaults;
  5. ;; subsequently, offers this routine's previously-used Offset-to-Layer Distance (even if ordinary Offset
  6. ;; distance has been changed) and Layer-to-change-to as defaults.
  7. ;; by Kent Cooper, August 2008
  8. (defun C:OL (/ offlaytemp offent)
  9. (initget 134)
  10. (setq
  11. offlaydist
  12. (cond
  13. (
  14. (getdist
  15. (strcat
  16. "\nOffset-to-Layer distance or [Through] <"
  17. (cond
  18. ((numberp offlaydist) (rtos offlaydist))
  19. ((= (getvar 'offsetdist) -1) "Through")
  20. ((rtos (getvar 'offsetdist)))
  21. ); end cond
  22. ">: "
  23. ); end strcat
  24. ); end getdist
  25. ); end first cond test
  26. (T (if (not offlaydist) (getvar 'offsetdist) offlaydist))
  27. ); end cond
  28. offlaytemp
  29. (getstring
  30. (strcat
  31. "\nLayer to Offset to <"
  32. (if offlay offlay (getvar 'clayer))
  33. ">: "
  34. ); end strcat
  35. ); end getstring
  36. offlay
  37. (cond
  38. ((/= offlaytemp "") offlaytemp)
  39. (offlay)
  40. (T (getvar 'clayer))
  41. ); end cond
  42. ); end setq
  43. (while
  44. (not
  45. (while
  46. (not
  47. (and
  48. (setq offent (ssget ":S" '((0 . "LINE,ARC,CIRCLE,ELLIPSE,LWPOLYLINE,SPLINE,XLINE,RAY"))))
  49. (= (cdr (assoc 70 (tblsearch "layer" (cdr (assoc 8 (entget (ssname offent 0))))))) 0); 0 for Unlocked, 4 for Locked
  50. ); end and
  51. ); end not
  52. (prompt "\nSelected Entity cannot be Offset, or is on a Locked Layer; try again: ")
  53. ); end while
  54. ); end not
  55. (command "_.undo" "_be")
  56. (command
  57. ".offset" offlaydist offent pause ""
  58. ".chprop" "l" "" "la" offlay ""
  59. ); end command
  60. (command "_.undo" "_e")
  61. ); end while
  62. ); end defun
  63. (princ "\nType OL to Offset to Layer.")
  64. (princ)
  65. [b]

 
任何帮助都将不胜感激。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 07:29:45 | 显示全部楼层
为什么不使用标准偏移命令的“Layer”和“Erase”选项?
 
  1. Specify offset distance or [Through/[color=blue]Erase[/color]/[color=red]Layer[/color]] <Through>:

 
PS:请编辑您的帖子,并用代码标签附上您的代码:
 
[突出显示][不突出]
  1. [/noparse][/highlight] Your code here [highlight][noparse]
[/noparse][/highlight]
回复

使用道具 举报

33

主题

117

帖子

85

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
170
发表于 2022-7-6 07:33:28 | 显示全部楼层
嗨,李,
 
我该如何在lisp例程中使用它?
 
 
 
“数学在于用最不明显的方式证明最明显的事情。”--乔治·波利亚
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 07:36:49 | 显示全部楼层
 
下面是一个自动设置“偏移”命令选项以擦除原始对象并偏移到当前层的示例:
 
使用offset命令的现有选项可以避免为此任务重新发明轮子。
在调用偏移命令以偏移到您选择的层之前和之后,可以很容易地添加其他代码来设置/重置当前层。
回复

使用道具 举报

57

主题

243

帖子

190

银币

后起之秀

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

铜币
285
发表于 2022-7-6 07:40:23 | 显示全部楼层
 
李,
 
考虑到这个想法,我如何应用于,使具有厚度的多段线可以偏移到变量plinewid值的一半?
我不知道还有什么方法可以在不以中心为中心的情况下绘制具有厚度的多段线,因此这将是一个这样做的机会。
为了更好地理解,我附上了一张照片。
 
  1. (defun c:ofpw (/ pw )
  2.    (setq pw (/(getvar "plinewid") 2))
  3. (setq pw (/ pw 2))
  4. (command "_.offset" pw "_E" "_Y" "_L" "_C");; not work
  5.    (while (< 0 (getvar 'cmdactive)) (command "\"))
  6.    (princ)
  7. )

082438thmdoc85lvcm1mtm.jpg
回复

使用道具 举报

33

主题

117

帖子

85

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
170
发表于 2022-7-6 07:42:14 | 显示全部楼层
您好,teknomatika,
 
我有另一个代码,我用它来调整各种多段线的厚度,但你的想法如果进一步发展,可能会证明是有用的,即有一个偏移,然后调整线的厚度。也许有人会把代码组合在一起。
 
  1. (Defun c:Plw (/ s ss sn i)
  2. (if (setq s  (ssadd)        
  3. ss (ssget "_x" '((0 . "*POLYLINE") (8 . "Estate - AAT,Estate - Hatched area,Estate - Lockable gate, Estate - SYL")))    ;<<<<< Enter layer names separated by comma  
  4. )   
  5. (progn      
  6.         (repeat (setq i (sslength ss))   
  7. (setq sn (ssname ss (setq i (1- i))))   
  8. (if (not (eq (cdr (assoc 100 (reverse (entget sn))))            
  9. "AcDb3dPolyline"         
  10.         )        
  11. )      
  12. (ssadd sn s)   
  13.         )      
  14. )      
  15. (if (> (sslength s) 0)   
  16. (command "_.pedit" "_m" s "" "w" 0.2 "")      
  17.         )      
  18. ;(princ "\n .... ")      
  19. ;(princ (strcat "Number of Polylines changed : "
  20.             " < "            
  21. ;(itoa (sslength s))             " > "         
  22. ;                )      
  23. ;        )   
  24. )   
  25. ;(princ "\n Couldn't find any 2D polyline !!")  
  26. )  
  27. (princ)
  28. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 07:46:45 | 显示全部楼层
李,
 
确实如此。
再次感谢你。
回复

使用道具 举报

57

主题

243

帖子

190

银币

后起之秀

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

铜币
285
发表于 2022-7-6 07:49:36 | 显示全部楼层
李,
 
这很好,但我仍在努力让它做我想做的事情,那就是做一个偏移,擦除原始线,然后改变偏移线的图层和线宽。。。任何帮助都将不胜感激。
 
 
“数学在于用最不明显的方式证明最明显的事情。”--乔治·波利亚
回复

使用道具 举报

33

主题

117

帖子

85

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
170
发表于 2022-7-6 07:52:16 | 显示全部楼层
 
不客气!
 
 
通过在调用offset命令之前将当前层设置为所需层(CLAYER系统变量),然后在评估offset命令后重置当前层,可以很容易地使用我的现有代码实现层分配。
 
但是,在调用offset命令之前,设置“线宽”(我假设您的意思是LWPolyline width)可能需要进行限制选择,然后通过在offset命令之后调用entlast函数对偏移实体进行操作。
 
到目前为止你有什么?
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 07:54:15 | 显示全部楼层
李,
 
没有太多的时间看例行程序,还不够精通lisp。。。仍在学习诀窍。这就是为什么我必须使用两个独立的例程,一个是偏移层,然后运行plw来改变厚度。试图调整编码,但没有成功。经历了大约六种不同的编码,但都没有成功。还查找了您在第一个命令行中输入的代码,但两者都没有深入了解。
 
 
 
“数学在于用最不明显的方式证明最明显的事情。”--乔治·波利亚
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-10 04:49 , Processed in 0.448415 second(s), 74 queries .

© 2020-2025 乐筑天下

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