明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2400|回复: 8

[已解答] 刚写的一个小程序发现有问题,请大神帮助

[复制链接]
发表于 2014-4-12 14:43:24 | 显示全部楼层 |阅读模式
5明经币
源程序如下
功能是把选择放入0-建筑底图中
(defun c:0T()
     (setq ceng "0-建筑底图")
     (PRINC "\n---将所选对象设置为")(princ ceng)(PRINC ",属性随层")
     (if (= (TBLOBJNAME "LAYER" ceng) nil)
     (command "layer" "n" ceng "c" "8" ceng "lt" "" "bylayer" ""))
     (while(setq a (ssget":s"))
     (setvar "cmdecho" 0)
     (command "change" a "" "p" "c" "bylayer" "la" ceng "lw" "bylayer" "")
     )
     (command "clayer" ceng)
     (PRINC "\n---将所选对象设置为")(princ ceng)(PRINC ",属性随层")
     (princ)
     )

发现问题,如果某层已经设置线型,并在图中linetype 为bylayer情况下, 切换到0-建筑底图 层中,原有线型就会消失
希望大神改进
思路

(defun c:0T()
     (setq ceng "0-建筑底图")
     (PRINC "\n---将所选对象设置为")(princ ceng)(PRINC ",属性随层")
     (if (= (TBLOBJNAME "LAYER" ceng) nil)
     (command "layer" "n" ceng "c" "8" ceng "lt" "" "bylayer" ""))
     (while(setq a (ssget":s"))
     (setvar "cmdecho" 0)
     判断物体所在图层是否已经设置非continue的线型,如果是
     将物体linetype转换为图层所设置的线型
     (command "change" a "" "p" "c" "bylayer" "la" ceng "lw" "bylayer" "")
     )
     (command "clayer" ceng)
     (PRINC "\n---将所选对象设置为")(princ ceng)(PRINC ",属性随层")
     (princ)
     )

跪求大神完善或者提供更好的源码


最佳答案

查看完整内容

(defun c:0T (/ ceng ss en dxf lt) (setvar "cmdecho" 0) (setq ceng "0-建筑底图") (princ (strcat "\n---将所选对象设置为" ceng ",属性随层")) (if (not (tblsearch "layer" ceng)) (command "_layer" "m" ceng "c" "8" ceng "lt" "Continuous" ceng "") (command "layer" "s" ceng "c" "8" "" "lt" "Continuous" ceng "") ) (while (setq ss (ssget ":s")) (repeat (setq n (sslength ss)) (setq e ...
"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

  • · 收集|主题: 58, 订阅: 4
发表于 2014-4-12 14:43:25 | 显示全部楼层
(defun c:0T (/ ceng ss en dxf lt)
        (setvar "cmdecho" 0)
        (setq ceng "0-建筑底图")
        (princ (strcat "\n---将所选对象设置为" ceng ",属性随层"))
        (if (not (tblsearch "layer" ceng))
                (command "_layer" "m" ceng "c" "8" ceng "lt" "Continuous" ceng "")
                (command "layer" "s" ceng "c" "8" "" "lt" "Continuous" ceng "")
        )
        (while (setq ss (ssget ":s"))
                (repeat (setq n (sslength ss))
                        (setq en (ssname ss (setq n (1- n))))
                        (setq dxf (entget en))
                        (if (not (cdr (assoc 6 dxf)))
                                (progn
                                        (setq lt (cdr (assoc 6 (entget (tblobjname "layer" (cdr (assoc 8 dxf)))))))
                                        (command "chprop" en "" "la" ceng "lw" "ByLayer" "lt" lt "")
                                )
                                (command "chprop" en "" "la" ceng "lw" "ByLayer" "")
                        )
                )
        )
        (princ (strcat "\n---将所选对象设置为" ceng ",属性随层"))
        (setvar "cmdecho" 1)
        (princ)
)
回复

使用道具 举报

发表于 2014-4-12 17:31:56 | 显示全部楼层
那就在改层以前,先把原来随层的线型信息提取出来,在放到0-建筑底图中后,再把它恢复到原来线型不就行了
回复

使用道具 举报

 楼主| 发表于 2014-4-12 20:12:46 | 显示全部楼层
哥,我是初学者,麻烦直接上代码,谢谢
回复

使用道具 举报

发表于 2014-4-12 21:29:16 | 显示全部楼层
;;;command太差了,给你整了一段,全部费掉command
;;;师兄 QQ 361865648

(defun c:0T (/ ceng ss ent i entdat layername layent laydat ltyp lwidth
             obj)
  (setq ceng "0-建筑底图")
  (if (= (TBLOBJNAME "LAYER" ceng) nil)
    (entmakex '(
                '(0 . "LAYER")
                '(100 . "AcDbSymbolTableRecord")
                '(100 . "AcDbLayerTableRecord")
                (cons 2 ceng)
                '(70 . 0)
                '(62 . 7)
                '(6 . "Continuous")
               )
    )
;;;旧代码    (command "layer" "n" ceng "c" "8" ceng "lt" "" "bylayer" "")
  )
;;;    (setvar "cmdecho" 0)
  (entget (tblobjname "layer" "0"))
  (while (and (setq ss (VL-CATCH-ALL-APPLY 'ssget (list ":S")))
              ss
              (not (VL-CATCH-ALL-ERROR-P ss))
         )
;;;    (setvar "cmdecho" 0)
    (PRINC "\n---将所选对象设置为")
    (princ ceng)
    (PRINC ",属性随层")
    (setq i 0)
    (repeat (sslength ss) ;_遍历选择集
      (setq ent              (ssname ss i)
            i              (1+ i)
            entdat    (entget ent)
            layername (cdr (assoc 8 entdat)) ;_层名
            layent    (tblobjname "layer" layername)
            laydat    (entget layent)
            ltyp      (cdr (assoc 6 laydat)) ;_线型
            Lwidth    (cdr (assoc 370 laydat)) ;_线宽
            color     (cdr (assoc 62 laydat)) ;_颜色
      )
      (setq obj (vlax-ename->vla-object ent))

      (vla-put-color obj acbylayer) ;_颜色为随层
      (vla-put-LineWeight obj acLnWtByLayer) ;_线宽为随层
;;;      (vla-put-linetype obj "bylayer");_线型为随层
      (if (= (vla-get-linetype obj) "bylayer")
        (vla-put-linetype obj ltyp) ;_线型固定
      )
;;;      (if (= (vla-get-lineweight obj) acLnWtByLayer)
;;;        (vla-put-LineWeight obj Lwidth) ;_线宽固定
;;;      )
;;;      (if (= (vla-get-color obj) acbylayer)
;;;        (vla-put-color obj color) ;_颜色固定
;;;      )
      (vla-put-layer obj ceng)
      (vlax-release-object obj)
    )
;;;    改前(command "change" a        "" "p" "c" "bylayer" "la" ceng "lw" "bylayer" "")

  )
;;;  (command "clayer" ceng)
  (setvar "clayer" ceng)
;;;     (PRINC "\n---将所选对象设置为 ")
;;;    (princ ceng)
;;;    (PRINC " ,属性随层")
  (princ)
)

点评

谢谢哥的帮助,但是图纸没达到我要的功能,和我开始的代码存在相同问题  发表于 2014-4-12 23:36
回复

使用道具 举报

 楼主| 发表于 2014-4-13 00:03:13 | 显示全部楼层
本帖最后由 tranney 于 2014-4-13 00:06 编辑

谢谢5楼给的代码,基本上快要达到效果了,增加了一句代码,最后效果见附图
(defun c:0T (/ ceng ss en dxf lt)
        (setvar "cmdecho" 0)
        (setq ceng "0-建筑底图")
        (princ (strcat "\n---将所选对象设置为" ceng ",属性随层"))
        (if (not (tblsearch "layer" ceng))
                (command "_layer" "m" ceng "c" "8" ceng "lt" "Continuous" ceng "")
                (command "layer" "s" ceng "c" "8" "" "lt" "Continuous" ceng "")
        )
        (while (setq ss (ssget ":s"))
                (repeat (setq n (sslength ss))
                        (setq en (ssname ss (setq n (1- n))))
                        (setq dxf (entget en))
                        (if (not (cdr (assoc 6 dxf)))
                                (progn
                                        (setq lt (cdr (assoc 6 (entget (tblobjname "layer" (cdr (assoc 8 dxf)))))))
                                        (command "chprop" en "" "la" ceng "lw" "ByLayer" "lt" lt "")
                                )
                                (command "chprop" en "" "la" ceng "lw" "ByLayer" "")
                        )
                )
        (command "change" a "" "p" "c" "bylayer" "la" ceng "lw" "bylayer" "");*增加本行代码后已达到要求
        )
        (princ (strcat "\n---将所选对象设置为" ceng ",属性随层"))
        (setvar "cmdecho" 1)
        (princ)
)

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2014-4-13 22:24:47 | 显示全部楼层
本帖最后由 caiqs 于 2014-4-13 22:25 编辑
tranney 发表于 2014-4-13 00:03
谢谢5楼给的代码,基本上快要达到效果了,增加了一句代码,最后效果见附图
(defun c:0T (/ ceng ss en dxf ...

你难道要的不是颜色和线宽随层,线型不随新层?
回复

使用道具 举报

 楼主| 发表于 2014-4-14 05:48:11 | 显示全部楼层
线型随新层不好,比如以前的中心线,虚线就都看不出来了
回复

使用道具 举报

发表于 2016-3-7 08:59:33 | 显示全部楼层
caiqs 发表于 2014-4-12 21:29
;;;command太差了,给你整了一段,全部费掉command
;;;师兄 QQ 361865648

如果针对图块呢? 特别是嵌套块
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 15:12 , Processed in 0.205914 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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