明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 13324|回复: 57

[讨论] 点取对象,根据颜色加粗所有对象------终于完成

  [复制链接]
发表于 2013-7-20 09:34:18 | 显示全部楼层 |阅读模式
本帖最后由 自贡黄明儒 于 2013-7-30 08:25 编辑

按理说,绘图我们不需要指定对象宽度,CAD打印时有一个简单的办法,指定颜色的宽度来指印。
我看见设计院的图,估计是他们偷懒,只画主要轮廓线,而且画得很粗,看起来也象模象样的。
有谁写过这样的程序吗,点取对象,根据颜色加粗所有对象?
  1. ;;*****************根据颜色,来加宽线   自贡黄明儒 2013年7月24日
  2. ;;特此鸣谢mccad wowan1314 ll_j
  3. (defun C:HHBC (/ COLOR EN FIL LAYLIS LEN PEDITVAR SS0 SSCIR SSLIN)
  4.   ;;(setvar "CLAYER" "0")
  5.   ;;1 Public1 分离选择集
  6.   ;;SSCIR SSLIN
  7.   (defun getMyss (ss0)
  8.     (command "_.select" ss0 "")
  9.     (setq ssCIR (ssget "_p" (list (cons 0 "CIRCLE"))))
  10.     (command "_.select" ss0 "")
  11.     (setq ssLIN (ssget "_p"
  12.          (list (cons 0 "ARC,LINE,LWPOLYLINE"))
  13.   )
  14.     )
  15.   )
  16.   ;;2 Public2 处理圆选择集
  17.   (defun cirSS (ssCIR LEN color / CENTER EN ENTLIST N R)
  18.     (if ssCIR
  19.       (repeat (setq n (sslength ssCIR))
  20. (setq en (ssname ssCIR (setq n (1- n))))
  21. (setq entlist (entget en))
  22. (setq r (* (cdr (assoc 40 entlist)) 2))
  23. (setq center (cdr (assoc 10 entlist)))
  24. (command "_.donut" (- r len) (+ r len) center "")
  25. (vlax-put (vlax-ename->vla-object (entlast)) 'color color)
  26. (command "_.erase" en "")
  27.       )
  28.     )
  29.   )
  30.   ;;3 Public3 处理线选择集
  31.   (defun LineSS (SSLIN len)
  32.     (SETQ PEDITVAR (GETVAR "PEDITACCEPT"))
  33.     (setvar "PEDITACCEPT" 1)
  34.     (if SSLIN
  35.       (command "_.pedit" "_M" ssLIN "" "_j" "" "w" len "")
  36.     )
  37.     (setvar "PEDITACCEPT" PEDITVAR)
  38.   )
  39.   ;;4 获取颜色
  40.   ;;color EN
  41.   (defun getcolor (/ ENTLIST LAYER)
  42.     (while (not en) (setq en (car (entsel "\n 点取颜色"))))
  43.     (setq entlist (entget en))
  44.     (if (setq color (cdr (assoc 62 entlist)))
  45.       nil
  46.       (progn
  47. (setq layer (cdr (assoc 8 entlist)))
  48. (setq color (cdr (assoc 62 (tblsearch "layer" layer))))
  49.       )
  50.     )
  51.   )
  52.   ;;5 预设线宽  
  53.   (defun PreWidth (en / CENTER ENLAST ENTLIST LEN LEN1 LI R)
  54.     (setq entlist (entget en))
  55.     (if (member (setq li (cdr (assoc 0 entlist)))
  56.   (list "ARC" "LINE" "CIRCLE" "LWPOLYLINE")
  57. )
  58.       (progn
  59. (setq len (vlax-curve-getDistAtParam en (vlax-curve-getEndParam en)))
  60. (setq len (/ len 100))
  61. (cond ((= li "CIRCLE")
  62.         (setq r (* (cdr (assoc 40 entlist)) 2))
  63.         (setq center (cdr (assoc 10 entlist)))
  64.         (command "donut" (- r len) (+ r len) center "")
  65.         (setq enlast (entlast))
  66.        )
  67.        ((= li "LWPOLYLINE") (command "_.PEDIT" en "W" len ""))
  68.        (T
  69.         (if (= (atof (getvar "acadver")) 16.1)
  70.    (command "_.PEDIT" en "Y" "W" len "")
  71.         ;昨天测试不加Y,今天测还是要加Y(7月25日)
  72.    (command "_.PEDIT" en "Y" "W" len "")
  73.         )
  74.        )
  75. )
  76. (princ "\n 当前线宽是 ")
  77. (princ len)
  78. (initget (+ 2 4))
  79. (setq len1 (getreal (strcat "\n 输入线宽<" (rtos len 2 3) ">")))
  80. (if len1
  81.    (progn (setq len len1)
  82.    (if enlast
  83.      (command "_.erase" enlast "")
  84.    )
  85.    )
  86. )
  87.       )
  88.       (progn (princ "\n 默认线宽") (princ (setq len 2.0)))
  89.     )
  90.     len
  91.   )
  92.   ;;6 处理颜色为指定颜色的对象
  93.   ;; LAYLIS
  94.   (defun Pro:color (color / D LAYER)
  95.     ;;指定颜色的随层随块层名
  96.     (while (setq d (tblnext "LAYER" (null d)))
  97.       (setq layer (cdr (assoc 2 d)))
  98.       (if (equal (cdr (assoc 62 d)) color)
  99. (setq layLis (if layLis
  100.          (strcat layLis "," layer)
  101.          layer
  102.        )
  103. )
  104.       )
  105.     )
  106.   )

;;7 本程序主程序
  (setvar "nomutt" 1)
  (princ "\n 拾取颜色")
  (setvar "nomutt" 0)
  (getcolor)       ;取得颜色color EN
  (setq len (PreWidth en))     ;线宽
  (setvar "nomutt" 1)
  (princ "\n 窗选处理范围<全部>")
  (Pro:color color)      ;得LAYLIS
  (setq fil (list
       '(-4 . "<AND")
       (cons 0 "ARC,LINE,CIRCLE,LWPOLYLINE")
       '(-4 . "<OR")
       (cons 62 color)
       '(-4 . "<AND")
       (cons 8 layLis)
       '(-4 . "<OR")
       (cons 62 0)
       (cons 62 256)
       '(-4 . "OR>")
       '(-4 . "AND>")
       '(-4 . "OR>")
       '(-4 . "AND>")
     )
  )
  (if (setq ss0 (ssget fil))
    nil
    (setq ss0 (ssget "X" fil))
  )
  (setvar "nomutt" 0)
  (IF ss0
    (progn (getMyss ss0)     ;分离出选择集SSCIR SSLIN
    (cirSS ssCIR LEN color)    ;处理圆选择集
    (LineSS SSLIN len)     ;处理线选择集
    )
  )
  ;;8 根据wowan1314建议,块就算了
  (princ)
)
;;*****************根据颜色,来加宽线   自贡黄明儒 2013年7月24日

wowan1314,以上程序中当
(setvar "PEDITACCEPT" 1)时
(command "_.PEDIT" en "Y" "W" len "")这个不加Y

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2018-9-3 21:57:58 | 显示全部楼层
下下来看看。,学习学习
发表于 2018-8-26 03:19:25 | 显示全部楼层
大神牛牛牛牛!
发表于 2018-10-24 11:34:07 | 显示全部楼层
不错的帖子
发表于 2013-7-20 09:46:47 | 显示全部楼层
圆需要处理成两个半圆弧段的多段线

点评

感谢老大回复,看来只能这样处理了。  发表于 2013-7-20 10:10
发表于 2013-7-20 10:14:08 | 显示全部楼层
圆用(command "donut"
其他用(command "pedit"

你是不是已经告别command 了?  我喜欢command

点评

据说反应器中不能用command,也许用矩阵就行了,我想  发表于 2013-7-20 10:20
 楼主| 发表于 2013-7-20 10:14:59 | 显示全部楼层
mccad 发表于 2013-7-20 09:46
圆需要处理成两个半圆弧段的多段线

这样一来,块中圆就比较麻烦了。牵涉到删除添加对象,又是矩阵转换。

点评

或者要加粗的块,事先做好。  发表于 2013-7-20 10:18
块中对象也要加粗的话,那你还是直接用打印颜色宽度来解决吧。 别用对象线宽了。  发表于 2013-7-20 10:17
 楼主| 发表于 2013-7-20 10:18:57 | 显示全部楼层
wowan1314 发表于 2013-7-20 10:14
圆用(command "donut"
其他用(command "pedit"

用command程序很简单,也容易理解。
我只不过在练习矩阵而已,有时用它确实快,省略了中间过程。比如你用al命令,明显可以看到,是先移动,然后旋转的,用矩阵就没有中间过程
 楼主| 发表于 2013-7-23 13:25:10 | 显示全部楼层
操作三步:
第一步,点取对象
第二步,输入线宽
第三步,窗选范围
 楼主| 发表于 2013-7-23 13:25:47 | 显示全部楼层
本帖最后由 自贡黄明儒 于 2013-7-23 14:38 编辑

(defun C:w1 (/ CENTER COLOR EN ENTLIST LAYER LEN LI R)
  ;;第一步,获取颜色
  ;;  (princ "\n 点取颜色")
  ;;(setvar "nomutt" 1)
  ;;(setq ss0 (ssget ":S:L" '((0 . "ARC,*LINE,CIRCLE"))))
  ;;(setvar "nomutt" 0)
  ;;(setq en (ssname ss0 0))  
  (while (not en) (setq en (car (entsel "\n 点取颜色"))))
  (setq entlist (entget en))
  (if (setq color (cdr (assoc 62 entlist)))
    nil
    (progn
      (setq layer (cdr (assoc 8 entlist)))
      (setq color (cdr (assoc 62 (tblsearch "layer" layer))))
    )
  )
  ;;第二步,预设线宽
  (if (member (setq li (cdr (assoc 0 entlist)))
       (list "ARC" "LINE" "CIRCLE" "LWPOLYLINE")
      )
    (progn
      (setq len (vlax-curve-getDistAtParam en (vlax-curve-getEndParam en)))
      (setq len (/ len 100))
      (cond ((= li "CIRCLE")
      (setq r (* (cdr (assoc 40 entlist)) 2))
      (setq center (cdr (assoc 10 entlist)))
      (command "donut" (- r len) (+ r len) center "")
      (command "_.erase" en "")
     )
     (t
      (command "_.PEDIT" en "W" len "")
     )
      )
      (princ "\n 当前线宽是 ")
      (princ len)
      (initget (+ 1 2 4))
      (setq len (getreal "\n 输入线宽:"))
    )
  )
  ;;第三步,处理颜色为指定颜色的对象
  ;;第四步,处理随层随块为指定颜色的对象
  ;;第五步,块就算了
)
发表于 2013-7-24 19:22:49 | 显示全部楼层
wowan1314 发表于 2013-7-24 05:14
圆用(command "donut"
其他用(command "pedit"

学习中...还得继续用command!

点评

entmake麻烦  发表于 2013-7-30 10:33
发表于 2013-7-24 19:23:39 | 显示全部楼层
顶起来!!
发表于 2013-7-24 19:24:07 | 显示全部楼层
呵呵,command好理解
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-19 05:33 , Processed in 0.164815 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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