找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1733|回复: 7

[求助] [求助]:求解柱子替换程序

[复制链接]
发表于 2007-8-16 14:28:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
平面上有无数个500x500的方柱,都是在轴线的交点上。居中位置。
现在想把500x500的柱子全部改为600x600,如何实现???
所有柱都是用多段线画的,是一个整体,但不是块,是块就比较好办。在同一个图层上,如何实现啊??
请高手指点???
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2007-8-16 15:34:53 | 显示全部楼层
以前写过的一个程序,对于所有选中物体,采用分别对每个物体按照其boundary box(就是物体的矩形包围框)的中心进行缩放。
对于这个问题应该合适。

  1. ;; The Aim of the Rountine:
  2. ;; To center scale the object according to their boundary center
  3. ;; The command name :scc
  4. ;; The platform: Acad2000 and after
  5. ;; by qjchen at [url]http://www.xdcad.net[/url] 2006.02.07
  6. ;; South China University of Technology, Architecture Department
  7. ;; Some code taken from Mr.Tony Hotchkiss, Thanks you, Tony
  8. ;; The codes frame camed from Mr. Tony Hotchkiss's Alignit.lsp, 2006.01
  9. ;; main program
  10. (defun c:scc ()
  11.   (command ".undo" "be")
  12.   (setting)
  13.   (zxs)
  14.   (resetting)
  15.   (command ".undo" "e")
  16.   (princ)
  17. )
  18. ;;end main program
  19. (prompt "\nCopyright (c) 2006 qjchen\n")
  20. (prompt "Enter scc to start.")
  21. (princ)
  22. ;;;subrountine to scale,
  23. (defun zxs (/ ssets scal len-ssets i entss objss res midpoint)
  24.   (prompt "\nthe object to be Scale:")  ;(setq ssets (ssget))
  25. ;;;(setq ssets (ssget '((0 . "CIRCLE,TEXT"))))
  26.   (setq ssets (ssget '((0 . "LWPOLYLINE"))))
  27.   (setq scal (getreal "\nthe Scale factor:"))
  28.   (setq len-ssets (sslength ssets))
  29.   (setq i 0)  ;;;Get the left bottom boundarybox point of the objects---> list (lst-pt-lef-bot)
  30.   (repeat len-ssets
  31.     (setq entss (ssname ssets i))
  32.     (setq objss (vlax-ename->vla-object entss))
  33.     (setq res (xyval1 objss))
  34.     (setq midpoint (midp (list (nth 0 res) (nth 1 res)) (list (nth 2 res)
  35.                                                               (nth 3 res)
  36.                                                         )
  37.                    )
  38.     )
  39.     (command "scale" entss "" midpoint scal)
  40.     (setq i (1+ i))
  41.   )
  42. )
  43. ;;; _ end of xyval
  44. ;;;;---The following codes are copy from Tony Hotchkiss at cadalyst
  45. ;;Get the boundingbox of one object
  46. (defun xyval1 (obj / minpt maxpt topy bottmy leftx rightx)
  47.   (vla-GetBoundingBox obj 'minpt 'maxpt)
  48.   (setq pt1 (vlax-safearray->list minpt)
  49.         pt2 (vlax-safearray->list maxpt)
  50.         topy (cadr pt2)
  51.         bottmy (cadr pt1)
  52.         leftx (car pt1)
  53.         rightx (car pt2)
  54.   )                                       ; _ end of setq
  55.   (list leftx bottmy rightx topy)
  56. )
  57. ;;;;The error function
  58. (defun err (s)
  59.   (if (= s "Function cancelled")
  60.     (princ "\nALIGNIT - cancelled: ")
  61.     (progn
  62.       (princ "\nALIGNIT - Error: ")
  63.       (princ s)
  64.       (terpri)
  65.     ) ;_ end of progn
  66.   ) ;_ end of if
  67.   (resetting)
  68.   (princ "SYSTEM VARIABLES have been reset\n")
  69.   (princ)
  70. )
  71. ; err
  72. ;;;setting and resetting the system variables
  73. (defun setv (systvar newval / x)
  74.   (setq x (read (strcat systvar "1")))
  75.   (set x (getvar systvar))
  76.   (setvar systvar newval)
  77. )
  78. ; setv
  79. (defun setting ()
  80.   (setq oerr *error*)
  81.   (setq *error* err)
  82.   (setv "BLIPMODE" 0)
  83.   (setv "CMDECHO" 0)
  84.   (setv "OSMODE" 0)
  85. )
  86. ; setting
  87. (defun rsetv (systvar)
  88.   (setq x (read (strcat systvar "1")))
  89.   (setvar systvar (eval x))
  90. )
  91. ; rsetv
  92. (defun resetting ()
  93.   (rsetv "BLIPMODE")
  94.   (rsetv "CMDECHO")
  95.   (rsetv "OSMODE")
  96.   (setq *error* oerr)
  97. )
  98. ;-------------------------------------------------------
  99. (defun midp (p1 p2)
  100.   (mapcar
  101.     '(lambda (x)
  102.        (/ x 2.)
  103.      )
  104.     (mapcar
  105.       '+
  106.       p1
  107.       p2
  108.     )
  109.   )
  110. )

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-8-17 00:06:02 | 显示全部楼层
谢谢楼上,你真是高手中的高手…………
非常感谢!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-8-17 06:49:12 | 显示全部楼层
真是不错的程序
谢谢您的分享
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-8-17 09:01:08 | 显示全部楼层
  1. [FONT=courier new];;; 网络U盘 [url]http://xyp1964.ys168.com/[/url] 下载并加载通用函数xyplib.vlx
  2. ;;; 500方柱改600方柱
  3. (defun c:test ()
  4.   (CMDLA0)
  5.   (setq        ss (ssget '((0 . "*POLYLINE")))
  6.         i  -1
  7.   )
  8.   (while (setq s1 (ssname ss (setq i (1+ i))))
  9.     (setq leng (xyp-get-CurveLength s1))
  10.     (if        (and (= leng 2000)
  11.              (equal (xyp-get-CurveStartPoint s1)
  12.                     (xyp-get-CurveEndPoint s1)
  13.              )
  14.         )
  15.       (progn
  16.         (setq pt (xyp-get-MinMaxPoint s1 5))
  17.         (command "scale" s1 "" pt (/ 2400 2000.0))
  18.       )
  19.     )
  20.   )
  21.   (CMDLA1)
  22. )[/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-8-17 09:25:40 | 显示全部楼层
优化版
  1. [FONT=courier new](defun c:test ()
  2.   (CMDLA0)
  3.   (setvar"osmode"0)
  4.   (if(null no1)(setq no1 500))
  5.   (if(null no2)(setq no2 600))
  6.   (setq        NO1 (UREAL 7 "" "原柱宽" NO1)
  7.         NO2 (UREAL 7 "" "新柱宽" NO2)
  8.         ss  (ssget '((0 . "*POLYLINE")))
  9.         i   -1
  10.   )
  11.   (while (setq s1 (ssname ss (setq i (1+ i))))
  12.     (if        (and (= (xyp-get-CurveLength s1) (* 4.0 no1))
  13.              (equal (xyp-get-CurveStartPoint s1)
  14.                     (xyp-get-CurveEndPoint s1)
  15.              )
  16.              (= (length (xyp-get-Vertexs s1 3)) 4)
  17.         )
  18.       (command "scale" s1 "" (xyp-get-MinMaxPoint s1 5) (/ no2 no1 1.0))
  19.     )
  20.   )
  21.   (CMDLA1)
  22. )[/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-8-18 09:56:54 | 显示全部楼层
谢谢斑竹,
另外延伸一下,如果是不等边柱,比如400x500要替换为500x600有没有办法呢???
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-8-18 19:58:50 | 显示全部楼层
:)
这个方法有两种
第一种比较简单,很容易编出来
就是用不等比例的scale(具体过程大概就是做临时块,插入,explode,purge)
不过这种不等比例的缩放后果就是矩形变成线了
必须用把线连成多义线的程序再把他们连起来。
这种方法对于柱子是斜向布置的话有点问题

第二种方法复杂点
就是找出每个柱子多义线的顶点,然后排序,依次计算各个点的偏移距离,entmod之。
应该可以做到斜向柱子的缩放。
以前做过II级钢筋(断点)批量转I级钢筋的程序就是这么做的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-17 05:40 , Processed in 0.311765 second(s), 45 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表