tranney 发表于 2014-4-12 14:43:24

刚写的一个小程序发现有问题,请大神帮助

源程序如下
功能是把选择放入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)
   )

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


namezg 发表于 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)
)

zyhandw 发表于 2014-4-12 17:31:56

那就在改层以前,先把原来随层的线型信息提取出来,在放到0-建筑底图中后,再把它恢复到原来线型不就行了

tranney 发表于 2014-4-12 20:12:46

哥,我是初学者,麻烦直接上代码,谢谢

caiqs 发表于 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)
)

tranney 发表于 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)
)

caiqs 发表于 2014-4-13 22:24:47

本帖最后由 caiqs 于 2014-4-13 22:25 编辑

tranney 发表于 2014-4-13 00:03 static/image/common/back.gif
谢谢5楼给的代码,基本上快要达到效果了,增加了一句代码,最后效果见附图
(defun c:0T (/ ceng ss en dxf ...
你难道要的不是颜色和线宽随层,线型不随新层?

tranney 发表于 2014-4-14 05:48:11

线型随新层不好,比如以前的中心线,虚线就都看不出来了

bikeboy 发表于 2016-3-7 08:59:33

caiqs 发表于 2014-4-12 21:29 static/image/common/back.gif
;;;command太差了,给你整了一段,全部费掉command
;;;师兄 QQ 361865648



如果针对图块呢? 特别是嵌套块
页: [1]
查看完整版本: 刚写的一个小程序发现有问题,请大神帮助