eachy 发表于 2003-5-14 14:31:25

[测试]:园林苗木标注程序。

Only For 2000+,命令:Ea_LHBZ((绿化标注)、Ea_SetScale(设置比例),欢迎试用并就其标注格式及苗木统计的规则提供意见,下一步将根据你提供的意见提供苗木统计并自动生成表格的功能。


更新:

动态更新词库

命令:Ea_LhBZ   标注命令
命令:Ea_EdLH   标注编辑
命令:Ea_SetScale 比例设置
命令:Ea_MKTitle统计表表头及表格生成
命令: TXT_TJ      统计图中相同字串的个数

下载:
http://www.xdcad.net/forum/showthread.php?postid=286213#post286213

doongs 发表于 2003-5-14 18:21:19

写法应该是比较标准的了
但是在图上可能有很大的自由性吧!
如标乔林的时候常常都要线把乔木都连上,然后才写什么树多少棵这样子
并不是每一个植栽都会写上规格,而是个别的才写出吧。要是每一个都要写,那还不累死人,也没有必要,一般的用一个总的植栽表就能解决!
如果能够按照此法写出能够自动统计的话,那就是大大的方便了,最好能支持一位小数,并且把灌木面积的平方也写到图就,那就标准了

eachy 发表于 2003-5-14 19:48:32

最初由 doongs 发布
写法应该是比较标准的了
但是在图上可能有很大的自由性吧!
如标乔林的时候常常都要线把乔木都连上,然后才写什么树多少棵这样子
并不是每一个植栽都会写上规格,而是个别的才写出吧。要是每一个都要写,那还不累?..
程序还有几个Bug,修改中。

我也仅是对照那个图写的,最好能将各种标法提供个全面图纸。

程序中除了名称以外其他的都为可选项,没有输入的时候是不标注的。

另外,关于统计时的分类有何建议?

aeo 发表于 2003-5-15 00:28:04

eachy同志,这几天就忙这事呀.
1.标注(不要每格都填,不然就麻烦,当然少了几项标注要完整.)
2.编辑,也要一个命令的.(大多是copy后改.)这点很重要.
3.统计

eachy 发表于 2003-5-15 01:03:36

最初由 aeo 发布
eachy同志,这几天就忙这事呀.
1.标注(不要每格都填,不然就麻烦,当然少了几项标注要完整.)
2.编辑,也要一个命令的.(大多是copy后改.)这点很重要.
3.统计
1 所提供所6个选项除第一个名称外,其余的根据需要填写,可以为空
2 程序生成的是属性块,2002中双击即可编辑,Copy后的亦如此编辑
3 统计程序尚未写,这是基础。我没有画过这种图,不知其中的习惯规则,慢慢来。

程序是用VL写的,对此我是新手,向你学习:6

雪晴 发表于 2003-5-15 01:24:01

乔木数量不要小数,只有灌木统计时需要小数。
在标注苗木规格时设个选项,图上想要标注苗木规格时打个勾,若不想显示时打个x,对话框里的规格始终要填写,便于以后的苗木统计。

doongs 发表于 2003-5-15 13:16:47

其实还有一个更深层次的问题,那就是以前这个图纸可能不是我画的,我也就无法按照这个方法来写植物的标注!统计也就无从说起了,其实大家最常用的还是“黄杨 5棵”“鸢尾3.2M”(这个M上是带平方的)这们的书书写方式,其实在以前有一个乔木统计的程序,对统计乔木已经相当不错了,但是到了灌木这就不行了,我看这个程序一读到小数点就嘎然而止了,把粘数点当成了字母,后面的小数也就无从提取了,让统计无法正确进行,如果能够修改一个这个程序使之支持小数再结合你这个植物标注的话,就更完美了,自己绘的图统计不在话下,就是别人非标准的模式也能够解决了!
-------------------------
乔木统计的lisp原文如下
;;;----------------------------------------------------------------
;;;程序入口
;;;
;;;
;;;可以在这里加入你自己的专业处理函数,形成符合自己专业要求的程序
;;;
;;;本程序可以免费修改、使用,但在本程序基础上所增添的代码,亦不得
;;;收取任何形式的费用,不得进行加密或编译成不可阅读的版本。
;;;
;;;2002.10.12   by Qlin
;;;----------------------------------------------------------------
(defun c:treecalc (/ lst_tree)
; 数据统计,生成统计数据表
(setq lst_tree (treecalc_calculate))

; 表格进一步处理,可加入排序、规格说明、单位等其它数据形成专业数据表

; 数据表输出
; (可以在这里加入表格绘制或数据输出到文件等功能)
(princ lst_tree)

(princ)
);end

;;;----------------------------------------------------------------
;;; 统计所选择的文字,返回统计后的表
;;; 2002.10.12 by Qlin
;;;----------------------------------------------------------------
(defun treecalc_calculate (/ ss ent1 str1 n lst_n lst_o n1 lst_all)
(setq n 0)
(if (setq ss (treecalc_gettext))
    (while (setq ent1 (ssname ss n))
      (setq str1 (cdr (assoc 1 (entget ent1))))
      (setq lst1 (mixstring->list str1))
      (if (> (length lst1) 1) ;判断文字格式
      (if (> (atoi (cadr lst1)) 0) ;判断是否含有数字
          (progn
            (setqstr2 (car lst1)
                  lst_n (list str2 (atoi (cadr lst1))))
            (if (setq lst_o (assoc str2 lst_all))
            (progn
                (setq n1 (+ (cadr lst_n)(cadr lst_o)))
                (setq lst_n (list str2 n1))
                (setqlst_all (subst lst_n lst_o lst_all))
            );progn
            (setq lst_all (cons lst_n lst_all))
            );if
          );progn
      );if
      );if
      (setq n (1+ n))
    );while
);if
(setq lst_all (reverse lst_all))
);end

;;;----------------------------------------------------------------
;;; 选定指定图层的文字实体,返回符合要求的选择集
;;;----------------------------------------------------------------
(defun treecalc_gettext (/ en ss1 lay)
(while (not en)
    (if (setq en (entsel "\n任选一标注文字以确定参加统计的文字图层:"))
      (if (/= (cdr (assoc 0 (entget (car en)))) "TEXT")
      (progn
          (setq en nil)
          (princ "非文字实体!")
      );progn
      (redraw (car en) 3)
      );if
    );if
);while
(setq lay (cdr (assoc 8 (entget (car en)))))
(princ "\n选中<")(princ lay)(princ ">层")
(princ ", 现在选择需计算文字实体:")
(setq ss1 (ssget (list (cons 0 "TEXT")(cons 8 lay))))
)

;;;----------------------------------------------------------------
;;; 将字符串以数字为间隔分解成字符串表
;;;----------------------------------------------------------------
(defun mixstring->list (str_in / lst_out n len1 lst_n
                      chr_c chr_n chr_p
                      str_c str_id
                      num_add str_add)
(defun num_add ()
    (if str_id
      (progn
      (if (/= str_c "")(setq lst_out (cons str_c lst_out)))
      (setqstr_c chr_c
            str_id nil
      );setq
      )
      (setq str_c (strcat str_c chr_c))
    );if
)

(defun str_add ()
    (if str_id
      (setq str_c (strcat str_c chr_c))
      (progn
      (if (/= str_c "")(setq lst_out (cons str_c lst_out)))
      (setqstr_c chr_c
            str_id T
      );setq
      )
    );if
)

;C-1: 加入对输入值的判断
(if (and str_in (/= str_in ""))
    (setq len1 (strlen str_in))
    (setq len1 0)
)

(setq n 1
      lst_n (list "0" "1" "2" "3" "4" "5" "6" "7" "8" "9")
      str_c "")

(repeat len1
    (setq chr_c (substr str_in n 1))
    (cond
      ((member chr_c lst_n)
       (num_add)
      )
      ((= chr_c ".")
       (if (< n len1)
          (setq chr_n (substr str_in (1+ n) 1))
         (setq chr_n "")
       );if
       (if (member chr_n lst_n)
         (num_add)
         (str_add)
      )      
      )
      ((= chr_c "-")
       (if (< n len1)
          (setq chr_n (substr str_in (1+ n) 1))
         (setq chr_n "")
       );if
       (if (or (member chr_n lst_n)(= chr_n "."))
         (num_add)
         (str_add)
      )
      )
      ((= chr_c "+")
       (if (< n len1)
          (setq chr_n (substr str_in (1+ n) 1))
         (setq chr_n "")
       );if
       (if (or (member chr_n lst_n)(= chr_n "."))
         (num_add)
         (str_add)
      )
      )
      ((or (= chr_c "E")(= chr_c "e"))
       (if (< n len1)
          (setq chr_n (substr str_in (1+ n) 1))
         (setq chr_n "")
       );if
       ;C-2: 修改判断条件使之支持‘2e-3’类型的数据
       (if (or
             (and (member chr_n lst_n)(member chr_p lst_n))
             (and (= chr_n "+")(member chr_p lst_n))
             (and (= chr_n "-")(member chr_p lst_n))
         );or
         (num_add)
         (str_add)
      )
      )
      (T(str_add))
    );cond
   
    (setq n (1+ n)
          chr_p chr_c
    )
);repeat

(if (> len1 0)
    (progn
      (if (/= str_c "")(setq lst_out (cons str_c lst_out)))
      (setq lst_out (reverse lst_out))
    );progn
);if
lst_out
)

eachy 发表于 2003-5-15 21:23:47

程序的关键是中西文拆分,连续的西文要作为一个字串,mixstring->list的弊端是判断 chr ,要将所有的字符都判断,其实换个思路就可以解决,中文是大字符 (ASCII chr)大于 126 的是中文,小于的是西文,用 While 循环就可以将西文拆分开,其中要用到 Vl-string->list 函数。
其实晓东工具葙中已经有中西文拆分的函数,完全可以利用现成的。

aeo 发表于 2003-5-15 21:57:47

最初由 eachy 发布

2 程序生成的是属性块,2002中双击即可编辑,Copy后的亦如此编辑


还是用那个生成时的对话框多好.一目了然.

还有,谁把常用的灌木,乔木名称分类汇总一下.

雪晴 发表于 2003-5-15 23:26:23

2

aeo 发表于 2003-5-18 00:46:41

1.就点两下,出错.
2.180度方向标.错
3.线和文字在一个块里,想移个地方,就只好重标了.
4.无名块,不是好办法.
5.用了很多ea:...舍不得公开?:)


还有要植物库,只要名称就行.这样:是小数还是整数,是株还是平方米,才能分清楚.名称里也好有个候选.(能不输入就不输入)

eachy 发表于 2003-5-18 08:35:58

最初由 aeo 发布
1.就点两下,出错.
2.180度方向标.错
3.线和文字在一个块里,想移个地方,就只好重标了.
4.无名块,不是好办法.
5.用了很多ea:...舍不得公开?:)


还有要植物库,只要名称就行.这样:是小数还是整数,是株还是平方...
下载地址:http://www.xdcad.net/modrator/file_upload/14/20030518082929_1.swf

1 点两点出错什么意思?
2 180度问题已修改
3无名块由CAD自动管理,这种情况应用是最佳选择
4没有什么舍得舍不得,对使用者而言一个文件更方便,如果真舍不得我连程序也不会写。论坛上很多朋友都有我程序的源码,而且每次更新后我都给他们发一份,愿意交流的话上MSN或QQ吧

aeo 发表于 2003-5-18 21:41:01

1.没有那一拐,就平着标出.应该有这种情况
3.如果想移动,起点就标不到植物上了.


我写的:
希望大家提供比较全的植物名称!

eachy 发表于 2003-5-18 22:01:16

我是这样处理数量的,当输入数字中含有 m 时标注m2(上标),不用在对话框中输入m2,没有 m 时仅标数字。
植物名称应该建立一个txt文件,可以自定义的,就像建筑中的词库管理。

补充:作为 txt 文件行数也不要太多,可以分成几个文件,否则加入列表后选择起来也不便,文件中的植物命名规则可以参考 过滤器 中的过滤选项

M玫瑰
M.......

这样读入的时候可以用快捷键,

修改了对话框,程序还在完善。

名称后面的选项是标注汉字还是标注代码(还要看文件的格式)选项。空 label 根据乔灌木选择自动调整为 株数、地径 或 面积、胸径。

雪晴 发表于 2003-5-22 19:37:06

乔木

无患子
雪松
日本柳杉
香樟
日本早樱
......
臭椿
白蜡


灌木


杜鹃
连翘
......
页: [1] 2 3
查看完整版本: (更新 5.26)[测试]:园林苗木标注程序。