找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 946|回复: 7

[LISP程序]:找错误

[复制链接]
发表于 2002-4-30 08:37:00 | 显示全部楼层 |阅读模式

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

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

×
(defun createlayer ( layname layCOL / LST  )
(if  (and  (= 'STR (type layname )) (= 'INT (type layCOL )) )
      (progn
      (setq olst ( list    ))
      (setq lst  (list '(0 . "LAYER") (cons '2 layname) '(70 . 0 ) (cons '62 layCOL)  '(6 . "CONTINUOUS")))

     (PRINT LST)
   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    (entmake lst)
    ) ;;end of progn

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

已领礼包: 6530个

财富等级: 富甲天下

发表于 2002-4-30 09:00:52 | 显示全部楼层
entmake符号表时必须有组码100项。这是我以前下载的程序,供参考:

  1. ;;; This routine will create a layer with any name you type:
  2.   (defun c:mlay ()        ; by Reinaldo Togores <rtogores@mundivia.es>
  3.     (setq laynam (getstring "\nLayer name: "))
  4.       (entmake
  5.        (list
  6.           '(0 . "LAYER")
  7.           '(5 . "28")
  8.           '(100 . "AcDbSymbolTableRecord")
  9.           '(100 . "AcDbLayerTableRecord")
  10.           (cons 2 laynam)
  11.           '(70 . 64)
  12.           '(62 . 7)
  13.           '(6 . "CONTINUOUS")
  14.       )))

  15.   (defun c:msty()
  16.     (setq stynam (getstring "\nStyle name: "))
  17.       (entmake
  18.        (list
  19.          '(0 . "STYLE")
  20.          '(5 . "28")
  21.           '(100 . "AcDbSymbolTableRecord")
  22.           '(100 . "AcDbTextStyleTableRecord")
  23.          (cons 2  stynam)
  24.          '(70 . 0)
  25.          '(40 . 0.0)
  26.          '(41 . 0.6)
  27.          '(50 . 0.161799)
  28.          '(71 . 0)
  29.          '(42 . 3.0)
  30.          '(3 . "romand.shx")
  31.          '(4 . "tjhzf.shx")
  32.      )))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-4-30 09:14:36 | 显示全部楼层
谢谢
可是 TBLNEXT返回的表没有这一项的?
如果要修改一个层的名称 是不是也要加上 100?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2002-4-30 09:25:10 | 显示全部楼层
用AutoLisp构造符号表时组码100是必须的,将两行照搬即可。用Lisp进行层的修改,我也没办法,看Acad的帮助好像是可以得,但是我没有成功,在网上询问也无结果。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 23个

财富等级: 恭喜发财

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

使用道具 举报

发表于 2002-4-30 11:09:07 | 显示全部楼层

送你一个函数,连抄带改的。

送你一个函数,连抄带改的。

  1. [FONT=courier new]

  2. (defun #m_Lay (LayName LayColor LayLineT / tList);;(#m_Lay "12" 1 "dashed")
  3.   (if (setq tList(tblsearch "layer" LayName))(progn
  4.     (setq LayColor0(dxf 62  tList)
  5.           LayLineT0(dxf 6  tList))
  6.     (if (and LayColor(/= LayColor LayColor0))
  7.       (command "-layer" "c" LayColor LayName ""))
  8.     (if (and LayLineT(/= LayLineT LayLineT0))
  9.       (command "-layer" "lt" LayLineT LayName ""))
  10.     )(progn
  11.     (setq tList (list
  12.                   '(0 . "LAYER")
  13.                   '(100 . "AcDbSymbolTableRecord")
  14.                   '(100 . "AcDbLayerTableRecord")
  15.                   '(70 . 0)
  16.                   (cons 2 LayName)
  17.                 ))
  18.     (if LayColor
  19.       (setq tList (append tlist (list (cons 62 LayColor)))))
  20.     (if LayLineT
  21.       (setq tList (append tlist (list (cons 6 LayLineT)))) )
  22.     (entmake tList)
  23.   ) )
  24. )
  25. [/font]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2002-4-30 11:22:11 | 显示全部楼层
我在程序中这样用,改层名用rename命令就可以。
  1. (setq old_lay (getvar "clayer"))
  2. (if (=(tblobjname "LAYER" "3") nil)
  3.     (progn
  4.         (entmake (list
  5.                     '(0 . "LAYER")
  6.                     '(100 . "AcDbSymbolTableRecord")
  7.                     '(100 . "AcDbLayerTableRecord")
  8.                     '(6 . "CONTINUOUS")
  9.                     '(62 . 3)
  10.                     '(70 . 0)
  11.                     (cons 2 "3")
  12.                   )
  13.         )
  14.     )
  15. )
  16. (setvar "clayer" "3")
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-4-30 20:45:38 | 显示全部楼层

建立新图层的方法

建立新的图层有几种办法:

1  用LAYER命令,不多说。
2  用ACTIVEX,但在R14中表现不稳定,不支持ACAD的多任务。
3  用ENTMAKE,这就是前面几位所说的建立新图层的办法,我推荐这种办法。但是,如果用TBLNEXT来索取DXF组码,信息不全,应该用TBLOBJNAME,用法如下:
(setq layer-0 (TBLOBJNAME "LAYER" "0"))
这是取得了0层的对象,数据DXF码为:
(setq dxf-layer-0 (entget layer-0))

((-1 . <Entity name: 2420478>) (0 . "LAYER") (5 . "F") (100 .
"AcDbSymbolTableRecord") (100 . "AcDbLayerTableRecord") (2 . "0") (70 . 0) (62
. 7) (6 . "CONTINUOUS"))

看见了,两个100呢,我们用SUBST 把(2 . “0”)改成 (2  . 新图层名字符串)就行了。以下是我使用的建立新图层的程序:

;;;--------------------------------------------;
;;;  图层生成 (makelayer layer color)
;;;  功能:生成一个图层并设置该图层为当前层
;;;        如果没有该图层,则生成,设为当前层
;;;        如果有,直接设为当前层
;;;  参数:
;;;         layer      字符串
;;;         color      整数
;;;           
;;;---------------------------------------
(defun makelayer (layer        color /        layer0 layer1 layer2 layer3 layer4
                  layer5)
  (if (not (setq layer0 (TBLOBJNAME "layer" layer)))
    (progn
      (setq layer0 (TBLOBJNAME "layer" "0"))
      (setq layer1 (entget layer0 '("*")))
      (setq layer2 (vl-remove (assoc -1 layer1) layer1))
      (setq layer3 (vl-remove (assoc 5 layer2) layer2))
      (setq layer4 (subst (cons 2 layer) (assoc 2 layer3) layer3))
      (setq layer5 (subst (cons 62 color) (assoc 62 layer4) layer4))
      (entmake layer5)
    )
    (progn
      (setq layer1 (entget layer0 '("*")))
      (setq layer2 (subst (cons 62 color) (assoc 62 layer1) layer1))
      (entmod layer2)
    )
  )
  (princ)
)
(vl-acad-defun 'makelayer)

以上程序用VLISPR14编写,在AUTOLISP中,不用VL-REMOVE,重新CONS有用元素就可以。如果不通过0层来传递,直接用
(entmake
  (cons 0  "LAYER")
  (cons 100 "AcDbSymbolTableRecord")
  (cons 100 "AcDbLayerTableRecord")
  (cons 2  图层名)
  (cons 70  0)
  (cosn 62 颜色号整数)
  (cons 6  "CONTINUOUS")
)

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-5 10:26 , Processed in 0.409941 second(s), 46 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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