明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4248|回复: 16

[LISP]请教写扩展数据的问题

  [复制链接]
发表于 2004-11-23 20:23:00 | 显示全部楼层 |阅读模式
我用LISP写了一个写扩展数据的程序,但运行起来相当慢(慢得不可忍受),请那位大侠帮我看看,能不能优化,使之加快运行速度,谢谢了! 源代码如下: (defun stbm (s0 db / ss sss b c)
(setq ss (entget (ssname s0 0)(list "SOUTH")))
(setq sss (ssname s0 0))
(cond ((= db "a")
(setq b '(("SOUTH" (1000 . "202101"))))
(setq c '("SOUTH" (1000 . "202101")))
)

((= db "ad")
(setq b '(("SOUTH" (1000 . "202111"))))
(setq c '("SOUTH" (1000 . "202111")))
)
)
(setq ss (subst (cons -3 b) (assoc -3 ss) ss))
(regapp "SOUTH")
(setq ss (append ss (list (cons '-3 (list c)))))
(entmod ss)
(entupd sss)
(setq s0 nil)
)
(defun c:SSD (/ zdx0 zdx s0)
(command "insert" "gc200" (list y x h) 1.0 1.0 0)
(setq s0 (ssget "X" '((2 . "GC200"))))
(stbm s0 "a")
(command "text" (list (+ y 0.5) (- x 0.75)) "2.0" "0" h)
(setq s0 (ssget "X" '((0 . "TEXT"))))(stbm s0 "ad")
)
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2004-11-24 08:42:00 | 显示全部楼层
就写扩展数据的部分: (setq ss (subst (cons -3 b) (assoc -3 ss) ss))
(regapp "SOUTH")
(setq ss (append ss (list (cons '-3 (list c)))))
(entmod ss) 基本上已经是最精简了,,, 不过你程序中的 (setq s0 ...)可以改为(setq s0 (entlast)),后面也就不用(ssname s0 0)了,而直接使用s0 但怎么说,你这个程序都不至于慢吧,更不用说慢得不能忍受,因为你连一个循环都没有,除非你的图有问题
 楼主| 发表于 2004-11-24 13:36:00 | 显示全部楼层
谢谢你,飞哥! 这是一段展点程序,我这只是其中的一小段代码,在主程序中还有读数据,循环展点等等,我试着展了大约3000点,等了好半天,我想,问题可能出在建立选集上面,下面这一句: (setq s0 (ssget "X" '((2 . "GC200"))))(stbm s0 "a") 和 (setq s0 (ssget "X" '((0 . "TEXT"))))(stbm s0 "ad") 一句上面,因为,如果在前面加上循环以后,如: (defun c:SSD (/ n zdx0 zdx s0) (setq n 3000) ;n是读数据以后得来的(读数据代码此处略) (repeat n
(command "insert" "gc200" (list y x h) 1.0 1.0 0)
(setq s0 (ssget "X" '((2 . "GC200"))))
(stbm s0 "a")
(command "text" (list (+ y 0.5) (- x 0.75)) "2.0" "0" h)
(setq s0 (ssget "X" '((0 . "TEXT"))))(stbm s0 "ad")
) ) 则每展一点,就要进行一次选择,而按照这样一种过滤法,选择集s0里面就会累积重复,从而造成重复进行选择重复进行操作,那当然就慢了.还有一种办法就是先展点,后加入扩展数据,选集一次建立统一对选择集进行操作,我今天进行了测试,不是很慢.能忍受.但现在有一个问题:这是地形点展绘,我的数据是混着的,即既有岸上点,又有水下点,它们在图形数据库中的其他属性均相同,在没加入扩展属性以前是无法将它们区分开的.我展点的时候是用它们的编码进行识别的,要加入不同的扩展属性,以便今后选择区分. 请飞哥帮忙想想办法,能不能展一点只选择当前的这一点,我没找到这样的办法.

发表于 2004-11-24 13:44:00 | 显示全部楼层
我不明白什么叫展点,什么叫展绘、水上点、水下点。。。


就按你的程序,重复3000次,插入块、写文字,不管怎么样都会很慢的。。。


你不如传个图上来,然后在用通俗的语言描述一下你要做什么。。。
 楼主| 发表于 2004-11-24 14:39:00 | 显示全部楼层
好!我下午就将有关数据及相关源程序发来,请你看看.(不是图,而是数据,要展绘于图上,你一看就明白了)
 楼主| 发表于 2004-11-24 18:04:00 | 显示全部楼层
飞哥:现将程序及数据传给你,请你看看.这是一段长江河道地形的水下点数据及部分边滩数据(虽然你不是搞测绘的,但我相信你能看懂),数据共有5项,分别是:点号,编码,y,x,h.其中编码0表示水边点;1表示水下点;2表示水上(陆地)点(在地形测量中,y,x与数学中是反着的).这段数据仅只有10来公里,而我们要测绘长江的水下地形图,往往一段工程有数百公里之遥,在绘图时不得不分段绘制.故展点速度就很重要.

本帖子中包含更多资源

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

x
 楼主| 发表于 2004-11-25 12:29:00 | 显示全部楼层
我搞忘记了传一个文件,即"GC200.DWG",现补上.

本帖子中包含更多资源

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

x
发表于 2004-11-25 13:37:00 | 显示全部楼层
我自己做了个块,


tmp文件修改了你的生成文字和块的方法,速度提高了些


tmp2使用了vla方法,把其中一些细节的方法做了改进,速度又提高了少许。。。


两种都基本上未修改你的程序的整体结构和思路,由于要生成这么多图形,所以不管怎么样,我想再怎么改进,速度都很难有很大的提高了。。。


测试过程,用tmp2处理1100个数据用了7秒多,你原来的程序用了57秒,我处理完所有的数据用了1分27秒,你的程序我没有等到结束





       

本帖子中包含更多资源

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

x
 楼主| 发表于 2004-11-25 13:59:00 | 显示全部楼层
十分感谢!我下午就去试一试!
发表于 2004-11-25 17:00:00 | 显示全部楼层
  1. ;;假设图中已有图块"gc200"
  2. ;;把文字&图块&xdata改以entmake,速度将快2倍
  3. ;;字体大小未定
  4. ;;未详细测试
  5. ;; 地形展点主程序
  6. (defun C:DXZD (/ FN N0 BLXS NAME NAME1 F0 F1 SXDM SXDJ ZHUJ Y X  H SBX S0
  7.                ASPACE)
  8.    (if (not BLC)
  9.        (setq BLC (BLCHS BLC))
  10.    )
  11.    ;;(command "LAYER" "N" "GCD" "C" 1 "")
  12.    ;;(command "layer" "s" "GCD" "")
  13.    ;;(command "style" "HZ" "rs" "" "0.8" "" "N" "N" "N")
  14.    (setq BLXS (/ BLC 1000.0))
  15.    (setq NAME (getfiled "输入水下点资料档案名:" "" "dat" 8))
  16.    (setq F (open (findfile NAME) "r"))
  17.    (setq N (atoi (read-line F)))
  18.    (setq  ZHUJ (getangle
  19.                "\n水下点旋转角度<偏离北方向:左 + 右 -   单位: 度> ? "
  20.            )        ;这里改成了取角度,输入180度,会自动转换成3.1519...
  21.   SBX   (getint "\n水边点写不写高程(写:1 不写:2):")
  22.    )
  23.    (if (= ZHUJ NIL)
  24.        (setq ZHUJ 0.0)
  25.    )
  26.    (setq N0 1)
  27.    (setq STIME (getvar "date"))
  28.    (while (<= N0 N)
  29.        (setq PARAM (DUSJ F))
  30.        (setq SXDJ (car PARAM))
  31.        (setq PT (cdr PARAM))
  32.        (setq H (last PT))
  33.        (cond
  34.            ((= SXDJ 2) (SSD PT))    ;sxdj=2 水上点展绘
  35.            ((= SXDJ 1) (DSD PT))    ;sxdj=1 水下点展绘
  36.            ((= SXDJ 0)      ;sxdj=0 水边点展绘
  37.              (cond
  38.    ((= SBX 2)
  39.      (MAKEINSERT "gc200" PT BLXS BLXS "186400")
  40.    )
  41.    ((= SBX 1) (SSD PT))
  42.              )        ;cond2
  43.            )
  44.        )          ;cond1
  45.        (setq N0 (+ N0 1))
  46.    )          ;end while
  47.    (close F)
  48.    (setq ETIME (getvar "date"))
  49.    (prompt
  50.        (strcat
  51.            "\n程式共耗用时间: "
  52.            (rtos (* 86400.0 (- (- ETIME STIME) (fix (- ETIME STIME))))
  53.          2
  54.          3
  55.            )
  56.            "秒"
  57.        )
  58.    )
  59.   (princ)
  60. )          ;END
  61. ;;地形展点展水下点
  62. (defun DSD (PT / X1 ZDX0 ZDX S0)
  63.    (setq ZDX0 (* BLXS 2.0))
  64.    (MAKEINSERT "gc200" PT BLXS BLXS "186400")
  65.    (setq  X (polar (list (car PT) (cadr PT))
  66.      (+ (* 1.5 pi) ZHUJ)
  67.      (* BLXS 0.25)
  68.      )
  69.    )
  70.    (setq X1 (polar X ZHUJ (* BLXS -0.5)))
  71.    (setq X (polar X ZHUJ (* BLXS 0.5)))
  72.    (MAKETEXT "r" X1 ZDX0 ZHUJ (rtos H 2 0) "186411")
  73.    (setq H (* (- H (fix H)) 10.0))
  74.    (MAKETEXT "n" X ZDX0 ZHUJ (rtos H 2 0) "186412")
  75. )          ;end
  76. ;;地形展点展岸上点
  77. (defun SSD (PT / ZDX0 ZDX S0)
  78.    (setq ZDX0 (* BLXS 2.0))
  79.    (MAKEINSERT "gc200" PT BLXS BLXS "202101")
  80.    (MAKETEXT
  81.        "n"
  82.        (list (+ (car PT) (* BLXS 0.5)) (- (cadr PT) (* BLXS 0.75)))
  83.        ZDX0
  84.        0
  85.        (rtos H 2 1)
  86.        "202111"
  87.    )
  88. )          ;end
  89. ;;读数据
  90. (defun DUSJ (F / STR)
  91.    (setq STR (read-line F))
  92.    (setq STR (vl-string-translate "," " " STR))
  93.    (cdr (read (strcat "(" STR ")")))
  94. )
  95. ;;输入比例尺函数
  96. (defun BLCHS (BLC / W1)
  97.    (setq W1 (getint "\输入比例尺:"))
  98.    (if W1
  99.        W1
  100.        BLC
  101.    )
  102. )
  103. (defun MAKETEXT  (FLAG PT HEI ANG STR DATA / PTX TOBJ)
  104.    (if (= (strcase FLAG) "R")
  105.        (entmake
  106.            (list '(0 . "TEXT")
  107.          (cons 10 PT)
  108.          '(40 . 0.002)
  109.          (cons 50 ANG)
  110.          (cons 1 STR)
  111.          (cons 11 PT)
  112.          '(72 . 2)
  113.          (list -3 (list "SOUTH" (cons 1000 DATA)))
  114.            )
  115.        )
  116.        (entmake (list '(0 . "TEXT")
  117.          (cons 10 PT)
  118.          '(40 . 0.002)
  119.          (cons 50 ANG)
  120.          (cons 1 STR)
  121.          (list -3 (list "SOUTH" (cons 1000 DATA)))
  122.            )
  123.        )
  124.    )
  125. )
  126. (defun MAKEINSERT (BLKNAME PT SX SY DATA)
  127.    (entmake (list '(0 . "INSERT")
  128.      '(100 . "AcDbBlockReference")
  129.      (cons 2 BLKNAME)
  130.      (cons 10 PT)
  131.      (cons 41 SX)
  132.      (cons 42 SY)
  133.      (list -3 (list "SOUTH" (cons 1000 DATA)))
  134.        )
  135.    )
  136. )
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-23 09:52 , Processed in 0.188248 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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