明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: caoyin

【分享明经——发程序、拜新年专贴】

    [复制链接]
发表于 2009-2-5 00:41:00 | 显示全部楼层
本帖最后由 作者 于 2009-2-5 0:42:34 编辑

真是高手如云,羡慕呀。真的要好好学习一下lisp了,祝高手们牛气冲天,更牛
发表于 2009-2-5 16:33:00 | 显示全部楼层
caoyin发表于2008-12-18 14:04:00....此程序缺少函数(LTAX:DOC)   (LTAX:BLKS)呀,请楼主补上吧

 楼主| 发表于 2009-2-6 09:21:00 | 显示全部楼层

回复:(zhongzilei)以下是引用caoyin在2008-12-18 1...

函数已经添加
发表于 2009-2-6 23:27:00 | 显示全部楼层
试了新修改的程序不能用呀,看看怎么回事
 楼主| 发表于 2009-2-7 11:00:00 | 显示全部楼层
回49楼 jxphklibin:KEYWD在此处不是函数,相当于(if KEYWD (strcat KEYWD "  "))
回53楼 zhongzilei:那个程序?发现什么问题?
发表于 2009-2-7 19:17:00 | 显示全部楼层
ncopy.lsp程序,我这里下了几次新修改过函数的程序,加载后都没有什么反应
 楼主| 发表于 2009-2-8 09:58:00 | 显示全部楼层
  1. ;;我在不同版本使用是发现了一些问题,修改了一下
  2. (defun C:NCOPY
  3.    (/ OS CM QA EM SS NEN $LT-ENTSEL$ EN ES EP P1 ELST TYP EN1 PP P2 SC DOC BLKS BLK)
  4.    ;;-----------------------------------------------------
  5.    ;;本程序支持函数
  6.    (defun lt:list-sub (lst sta len / item n)
  7.    (setq item (nth sta lst) n (- (length lst) sta))
  8.    (while (/= (length (setq lst (member item lst))) n) (setq lst (cdr lst)))
  9.    (setq item (nth (1- len) lst) lst (reverse lst))
  10.    (while (/= (length (setq lst (member item lst))) len) (setq lst (cdr lst)))
  11.    (reverse lst)
  12.    )
  13.    (defun lt:ss->list (ss / lst)
  14.    (foreach x (ssnamex ss)
  15.      (if (= (car x) 3) (setq lst (append lst (list (cadr x)))))
  16.    )
  17.    lst
  18.    )
  19.    ;;-----------------------------------------------------
  20.    (sssetfirst nil nil)
  21.    (setq OS (getvar "osmode")
  22.          CM (getvar "cmdecho")
  23.          QA (getvar "qaflags")
  24.          EM (getvar "explmode")
  25.    )
  26.    (setvar "cmdecho" 0)
  27.    (setvar "osmode" 0)
  28.    (setvar "qaflags" 1)
  29.    (setvar "explmode" 1)
  30.    (setq SS (ssadd))
  31.    (princ "\n复制块、多段线、多线或标注中的套嵌对象...")
  32.    (setq $LT-ENTSEL$ T)
  33.    (while (setq NEN (lt:entsel nil nil nil))
  34.      (if (= (length NEN) 2)
  35.        (setq EN (car NEN))
  36.        (setq EN (car (last NEN)))
  37.      )
  38.      (cond ((if (ssmemb EN SS)
  39.               (princ "重复选择,忽略。")
  40.               (progn
  41.                 (setq ELST (entget EN)
  42.                       TYP  (cdr (assoc 0 ELST))
  43.                 )
  44.                 nil
  45.               )
  46.             )
  47.            )
  48.            ((= TYP "MLINE")
  49.             (entmake ELST)
  50.             (setq EN1 (entlast))
  51.             (command "_.explode" EN1 "")
  52.             (setq ES  (lt:ss->list (ssget "_P"))
  53.                   P1  (cadr NEN)
  54.                   EN1 (nth (car (vl-sort-i
  55.                                   (mapcar '(lambda (X)
  56.                                              (distance (vlax-curve-getClosestPointTo X P1) P1)
  57.                                            )
  58.                                           ES
  59.                                   )
  60.                                   '<
  61.                                 )
  62.                            )
  63.                            ES
  64.                       )
  65.             )
  66.             (foreach X ES
  67.               (if (not (eq X EN1)) (entdel X))
  68.             )
  69.            )
  70.            ((= TYP "LWPOLYLINE")
  71.             (setq PP    (fix (vlax-curve-getParamAtPoint
  72.                                EN
  73.                                (apply 'vlax-curve-getClosestPointTo NEN)
  74.                              )
  75.                         )
  76.                   ELST1 (lt:list-sub ELST 0 (vl-position (assoc 10 ELST) ELST))
  77.                   ELST1 (subst '(70 . 0) (assoc 70 ELST1) ELST1)
  78.                   ELST2 (member (assoc 10 ELST) ELST)
  79.                   ELST3 (member (assoc 210 ELST2) ELST2)
  80.             )
  81.             (if (and (vlax-curve-isClosed EN)
  82.                      (/= (setq EP (vlax-curve-getEndParam EN)) 1)
  83.                      (= EP (1+ PP))
  84.                 )
  85.               (setq ELST2 (append (lt:list-sub ELST2 (* PP 4) 4)
  86.                                   (lt:list-sub ELST2 0 4)
  87.                           )
  88.               )
  89.               (setq ELST2 (lt:list-sub ELST2 (* PP 4) 8))
  90.             )
  91.             (entmake (append ELST1 ELST2 ELST3))
  92.             (setq EN1 (entlast))
  93.            )
  94.            ((= TYP "INSERT")
  95.             (setq SC (mapcar '(lambda (X) (assoc X ELST)) '(10 41 42 43 50))
  96.                   P1 (cdar SC)
  97.                   SC (cdr SC)
  98.             )
  99.             (entmake (entget (car NEN)))
  100.             (setq EN1 (entlast)
  101.                   DOC (vla-get-activedocument (vlax-get-acad-object))
  102.                   BLKS (vla-get-Blocks DOC)
  103.             )
  104.             (vlax-invoke DOC
  105.                          'CopyObjects
  106.                          (list (en2obj EN1))
  107.                          (setq BLK (vla-add BLKS (vlax-3d-point '(0 0 0)) "*U"))
  108.             )
  109.             (setq BLK (vla-get-name BLK))
  110.             (entdel EN1)
  111.             (entmake (vl-list* '(0 . "INSERT") (cons 2 BLK) (cons 10 P1) SC))
  112.             (setq EN1 (entlast))
  113.             (vl-catch-all-apply 'vla-delete (list (vla-item BLKS BLK)))
  114.            )
  115.            ((= TYP "ATTRIB")
  116.             (princ "\n所选对象为属性,自动转换为单行文字...")
  117.             (setq ELST (vl-remove-if '(lambda (X)
  118.                                         (member (car X) '(-1 0 330 5 100 2 70 71 72 74))
  119.                                       )
  120.                                      ELST
  121.                        )
  122.             )
  123.             (entmake (cons '(0 . "TEXT") ELST))
  124.             (setq EN1 (entlast))
  125.            )
  126.            ((= TYP "DIMENSION")
  127.             (entmake (entget (car NEN)))
  128.             (setq EN1 (entlast))
  129.            )
  130.            (T (command "_.copy" EN "" "0,0" "0,0")
  131.               (while (/= 0 (getvar "cmdactive")) (command ""))
  132.               (setq EN1 (entlast))
  133.            )
  134.      )
  135.      (if EN1
  136.        (progn
  137.          (command "_.draworder" EN1 "" "_f")
  138.          (ssadd EN1 SS)
  139.          (redraw EN1 3)
  140.        )
  141.      )
  142.    )
  143.    (if (and SS (/= (sslength SS) 0))
  144.      (progn
  145.        (setvar "osmode" OS)
  146.        (if (setq P1 (getpoint "\n指定基点 <原位置>: "))
  147.          (progn
  148.            (command "_.move" SS "" "_non" P1)
  149.            (princ "指定第二点: ")
  150.            (command "\")
  151.          )
  152.        )
  153.        (if (equal (getvar "lastpoint") P1 1e-7)
  154.          (command "_.erase" SS "")
  155.        )
  156.        (command "_.select" SS "")
  157.        (if (setq SS1 (ssget "_P" '((0 . "INSERT"))))
  158.          (command "_.explode" SS1 "");;;
  159.        )
  160.        (command "_.select" SS "")
  161.      )
  162.    )
  163.    (setvar "cmdecho" CM)
  164.    (setvar "osmode" OS)
  165.    (setvar "qaflags" QA)
  166.    (setvar "explmode" EM)
  167.    (princ)
  168. )
发表于 2009-2-8 10:35:00 | 显示全部楼层

版主,在CAD2006下试了还是不行的,输入命令有如下提示,就结束了

命令: ap
APPLOAD 已成功加载 NCOPY.lsp。


命令:
命令:
命令: NCOPY

复制块、多段线、多线或标注中的套嵌对象...
命令:

 楼主| 发表于 2009-2-8 11:30:00 | 显示全部楼层
你一行一行代码测试一下,把出错的地方发给我看看
发表于 2009-2-8 12:11:00 | 显示全部楼层

缺少函数T:ENTSEL,加上即可以

但复制块中对象时会提示如下信息:

no function definition: EN2OBJ

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

本版积分规则

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

GMT+8, 2024-11-22 19:55 , Processed in 0.187429 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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