明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1347|回复: 6

[求助]帮忙改进一下我的自己的烂程序

[复制链接]
发表于 2008-3-13 12:51 | 显示全部楼层 |阅读模式
下面是我自己写的一个程序,主要功能就是把单线变成双线。
但是有一些缺陷。
缺陷1:如果变成双线的对象在屏幕显示以外,那么就会出错。第二条镜像的线就会镜像的别的地方去。
缺陷2:运行的速度很慢,运行的时候命令行一直会出现命令出错XXX的提示,不过程序还是能正常的跑完。
哪位能帮我看看,有什么办法可以解决?
  1. (defun c:DoubleLine ( / WaterPipeWidth 1_osmode num index a ss1 name1 ent1 spt mpt )
  2. (setq ss1 (ssget (list (cons 0 "line"))))
  3.   ;(setq WaterPipeWidth (getreal "\n输入宽度:"))
  4.   (PROMPT "\nEnter a Value:")
  5.   (SETQ a (/(GETREAL)2))
  6.   (setq num (sslength ss1))
  7.   (setq index 0)
  8.   (setq 1_osmode (getvar "osmode"))
  9.   (setvar "osmode" 0)
  10. (repeat num
  11.   (setq name1 (ssname ss1 index))
  12.   (setq ent1 (entget name1))
  13.   (setq spt (cdr (assoc 10 ent1)))
  14.   (setq mpt (cdr (assoc 11 ent1)))
  15.   (command "offset" a name1 spt "" "" "")
  16.   (command "mirror" "l" "" spt mpt "n" "" """")
  17.   (COMMAND "CHPROP" name1 "" "c" "9" "lt" "center2" "" "")
  18.   (setq index (1+ index))
  19. )
  20.   (setvar "osmode" 1_osmode)
  21.   (princ)
  22.   )
发表于 2008-3-13 14:23 | 显示全部楼层
  1. (defun c:DoubleLine ( / ss1 a index obj)
  2.   (if (and (setq ss1 (ssget '((0 . "line"))))
  3.            (SETQ a   (GETREAL "\nEnter a Value: "))
  4.       )
  5.      (progn
  6.        (setq a (/ a 2))
  7.        (repeat (setq index (sslength ss1))
  8.          (setq index (1- index)
  9.                obj   (vlax-ename->vla-object (ssname ss1 index))
  10.          )
  11.          (vla-offset obj a)
  12.          (vla-offset obj (- a))
  13.        )
  14.     )
  15.   )
  16.   (princ)
  17. )
 楼主| 发表于 2008-3-13 23:56 | 显示全部楼层

比我的速度快多了~

为什么?是因为用了vla开头的这种函数吗?

另外能不能把中间的(也就是原来的那条做上下偏移的线)改成中心线,8号色?

发表于 2008-3-14 07:00 | 显示全部楼层
  1. (defun c:DoubleLine ( / ss1 a index obj)
  2.   (if (and (setq ss1 (ssget '((0 . "line"))))
  3.            (SETQ a   (GETREAL "\nEnter a Value: "))
  4.       )
  5.      (progn
  6.        (setq a (/ a 2))
  7.        (repeat (setq index (sslength ss1))
  8.          (setq index (1- index)
  9.                obj   (vlax-ename->vla-object (ssname ss1 index))
  10.          )  
  11.          (vla-offset obj a)
  12.          (vla-offset obj (- a))
  13.   (vla-put-linetype obj "center")
  14.   (setq col(vla-get-truecolor obj))
  15.   (vla-put-colorindex col 8)
  16.   (vla-put-truecolor obj col)
  17.        )
  18.     )
  19.   )
  20.   (princ)
  21. )
发表于 2008-3-14 11:59 | 显示全部楼层
如果不用Vlisp,用这个看看
  1. (defun c:DoubleLine ( / WaterPipeWidth 1_osmode num index a ss1 name1 ent1 spt mpt
  2.      angSE spt0 mpt0 spt1 mpt1 col lty lstLine)
  3. (setq ss1 (ssget (list (cons 0 "line"))))
  4.    ;(setq WaterPipeWidth (getreal "\n怀遵僅:"))
  5.    (PROMPT "\nEnter a Value:")
  6.    (SETQ a (/(GETREAL)2))
  7.    (setq num (sslength ss1))
  8.    (setq index 0)
  9.    (setq 1_osmode (getvar "osmode"))
  10.    (setvar "osmode" 0)
  11. (repeat num
  12.   (setq name1 (ssname ss1 index))
  13.   (setq ent1 (entget name1))  
  14.    (setq col (cdr (assoc 62 ent1))
  15.   lty (cdr (assoc 6 ent1))
  16.   spt (cdr (assoc 10 ent1))
  17.   mpt (cdr (assoc 11 ent1))
  18.   angSE (angle spt mpt)
  19.   spt0 (list (- (car spt) (* (sin angSE) a)) (+ (cadr spt) (* (cos angSE) a)))
  20.   spt1 (list (+ (car spt) (* (sin angSE) a)) (- (cadr spt) (* (cos angSE) a)))
  21.   mpt0 (list (- (car mpt) (* (sin angSE) a)) (+ (cadr mpt) (* (cos angSE) a)))
  22.   mpt1 (list (+ (car mpt) (* (sin angSE) a)) (- (cadr mpt) (* (cos angSE) a)))
  23.   )
  24.   (if (= col nil) (setq col 256)) ;256 means bylayer color
  25.   (setq lstLine (list '(0 . "line") (cons 62 col)(cons 10 spt0) (cons 11 mpt0)))
  26.   (if (/= lty nil) (setq lstline (append lstline (list (cons 6 lty)))))
  27.   (entmake lstLine)
  28.   (setq lstLine (list '(0 . "line") (cons 62 col)(cons 10 spt1) (cons 11 mpt1)))
  29.   (if (/= lty nil) (setq lstline (append lstline (list (cons 6 lty)))))
  30.   (entmake lstLine)
  31.   
  32.    (COMMAND "CHPROP" name1 "" "c" "9" "lt" "center2" "")
  33.    (setq index (1+ index))
  34. )
  35.    (setvar "osmode" 1_osmode)
  36.    (princ)
  37.    )
 楼主| 发表于 2008-3-14 23:17 | 显示全部楼层

两个都很好用~谢谢~

特别是二楼的兄弟,别我的程序快多了~

五楼的也不我快。

呵呵~~!现在水管单线变双线容易多了~

发表于 2008-3-15 21:08 | 显示全部楼层

5楼的,计算点位,挺有耐心的...

最简单的思路就是偏移.

当然还有一种思路就是用mline...呵呵..这个变化就比较多了...

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-2 21:03 , Processed in 1.484784 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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