[求助]扩展数据的添加
(setq roomnam (ssget '((0 . "mtext"))))<BR> (setq roomnam (ssname roomnam 0))<BR> (setq room roomnam)<BR> (setq roomnam (entget roomnam)) ;获得最新图元的定义数据的关联表<BR> (setq pt (assoc 10 roomnam))<BR> (setq pt (list (nth 1 pt) (nth 2 pt)))<BR> <BR> (setq area (/ aa 1000000)) ;aa是由其它程序求出的<BR>(regapp "面积") ;注册应用名称 (面积)<BR> (setq exdata '((-3<BR> ("面积"<BR> (cons 1000 area)<BR> <BR> )<BR> )<BR> )<BR> )<BR> (princ exdata)<BR> (setq newent (append roomnam exdata)) ;在图元的表中增加新的表 <BR> (entmod newent)本想利用该程序在文字上添加扩展数据(如房间面积、长、宽等数据)
可出现错误,请各位指教! (defun C:TT ()<BR> (setq ROOMNAM (ssget '((0 . "mtext"))))<BR> (setq ROOMNAM (ssname ROOMNAM 0))<BR> (setq ROOM ROOMNAM)<BR> (setq ROOMNAM (entget ROOMNAM)) ;獲得最新圖元的定義資料的關聯表<BR> (setq PT (assoc 10 ROOMNAM))<BR> (setq PT (list (nth 1 PT) (nth 2 PT)))<BR> (setq AREA (/ 100.0 1000000)) ;aa是由其他程式求出的<BR> ;(regapp "面積") ;註冊應用名稱 (面積)<BR> (setq<BR> EXDATA (list<BR> (append<BR> (list -3)<BR> (list<BR> (append (list "面積") (list (cons 1000 (rtos AREA))))<BR> )<BR> )<BR> )<BR> )<BR> (princ EXDATA)<BR> (setq NEWENT (append ROOMNAM EXDATA)) ;在圖元的表中增加新的表 <BR> (entmod NEWENT)<BR>) 请问楼主增加属性表如何能够导出去呢,增加属性无非也就是要建数据库呀。 不好意思,lucas。我拖动页面的时候不小心点中了你的鸡蛋。我补了朵鲜花给你作为补偿:)
sorry。
再次请教扩展数据
谢谢给出的解答,我将程序按你给出的程序改了后能将单个扩展数据添加上去,但我的程序改成如下就总出问题:
(defun C:drt ()<BR> (setq roomnam (ssget '((0 . "mtext"))))<BR> (setq roomnam (ssname roomnam 0))<BR> (setq room roomnam)<BR> (setq roomnam (entget roomnam)) ;获得最新图元的定义数据的关联表<BR> (setq pt (assoc 10 roomnam))<BR> (setq pt (list (nth 1 pt) (nth 2 pt)))<BR>;;;;;;;;开始求出房间面积<BR> (setvar "cecolor" "1")<BR> (command "bpoly" pt "")<BR> (setq en (entlast))<BR> (if (/= en nil)<BR> (progn<BR> (command "area" "o" en)<BR> (setq aa (getvar "area"))<BR> (redraw en 3)<BR> (entdel en)<BR> )<BR> )<BR> (setq area (/ aa 1000000)) ;求出面积<BR> (setq rh 2.5)<BR> (setq hc 25)<BR> (setq fl (* (* area rh) hc))<BR>;;;;;;;;结束求出房间面积<BR> (setq appdata (list "面积" "换气次数" "送风量" "风口类型" "风口数量"))<BR> (setq i 0) ;(princ appname)<BR> (repeat 5<BR> (progn<BR> (setq appname (nth i appdata))<BR> (regapp appname) ;注册应用名称 (面积)<BR> (setq<BR> exdata<BR> (list<BR> (append<BR> (list -3)<BR> (list<BR> (append (list appname)<BR> (list (cons 1000 (rtos area)))<BR> )<BR> )<BR> )<BR> )<BR> )<BR> )<BR> (setq newent (append roomnam exdata)) ;在图元的表中增加新的表 <BR> (entmod newent)<BR> (setq roomnam newent)<BR> (setq i (+ i 1))<BR> )<BR> )<BR> )
我的程序用意是,将"面积" "换气次数" "送风量" "风口类型" "风口数量"通过循环一个个添加为文字的扩展数据,运行后查数据,只在风口数量添加进去(可能是每次循环后将前面添加的覆盖了)不知如何修正。
我将程序改为如下:
(defun C:drt ()<BR> (setq roomnam (ssget '((0 . "mtext"))))<BR> (setq roomnam (ssname roomnam 0))<BR> (setq room roomnam)<BR> (setq roomnam (entget roomnam)) ;获得最新图元的定义数据的关联表<BR> (setq pt (assoc 10 roomnam))<BR> (setq pt (list (nth 1 pt) (nth 2 pt)))<BR>;;;;;;;;开始求出房间面积<BR> (setvar "cecolor" "1")<BR> (command "bpoly" pt "")<BR> (setq en (entlast))<BR> (if (/= en nil)<BR> (progn<BR> (command "area" "o" en)<BR> (setq aa (getvar "area"))<BR> (redraw en 3)<BR> (entdel en)<BR> )<BR> )<BR> (setq area (/ aa 1000000)) ;求出面积<BR> (setq rh 2.5)<BR> (setq hc 25)<BR> (setq fl (* (* area rh) hc))<BR>;;;;;;;;结束求出房间面积<BR> ;setq appdata (list "面积" "换气次数" "送风量" "风口类型" "风口数量"))<BR> (setq i 0) <BR> (setq appname "扩展数据")<BR>(regapp appname) ;注册应用名称 (面积)<BR> (setq<BR> exdata<BR> (list<BR> (append<BR> (list -3)<BR> (list<BR> (append (list appname)<BR> (append (list (cons 1000 (rtos area)))<BR> (list (cons 1010 (rtos fl))) )<BR> )<BR> )<BR> )<BR> )<BR> )<BR> (setq newent (append roomnam exdata)) ;在图元的表中增加新的表 <BR> (entmod newent)<BR> )<BR>
本来想 用 (append (list (cons 1000 (rtos area)))<BR> (list (cons 1010 (rtos fl))) 在这将所有扩展数据都添加上去,可只加了一条就提示扩展数据错误
请指教! 字符串1000是可以重复多次使用的,所以你可以组织完后一次附着的。 xyzjint_cn发表于2004-2-22 10:37:00static/image/common/back.gif回复:(xyzjint_cn)再次请教扩展数据谢谢给出的解答,我将程序按你给出的程序改了后能将单个扩展数据添加上去,
但我的程序改成如下就总出问题:
(defun C:drt () (setq roomnam (
<FONT style="BACKGROUND-COLOR: #f3f3f3">延伸資料由一個以上的 1001 群組所組成,每一個群組都是以唯一的應用程式名稱開始。entget 所傳回的 xdata 群組依循定義資料在資料庫內儲存的順序。<BR>在每一個應用程式的群組內,資料的內容、意義及組織都是由各應用程式所定義。AutoCAD 會維護資訊,但不使用它。此表格也展示在範圍1000 1071 之間的 xdata 之群組碼。這其中的很多群組碼都是用於熟悉的資料類型,如下:</FONT>
<FONT style="BACKGROUND-COLOR: #f3f3f3">字串</FONT>
<FONT style="BACKGROUND-COLOR: #f3f3f3">1000. 延伸資料內字串的最大長度為 255 個位元組(第 256 個位元組保留給空字元)。</FONT>
<FONT style="BACKGROUND-COLOR: #f3f3f3">應用程式名稱</FONT>
<FONT style="BACKGROUND-COLOR: #f3f3f3">1001(也是字串值)。應用程式名稱的長度上限為 31 個位元組(第 32 個位元組保留給空字元),且必須遵循符號表名稱(如圖層名稱)的規則。應用程式名稱可包含字母、數字及特殊字元$(錢號)、-(連字號)以及 _(下線)。它不可包含空格。</FONT>
<FONT style="BACKGROUND-COLOR: #f3f3f3">圖層名稱</FONT>
<FONT style="BACKGROUND-COLOR: #f3f3f3">1003. 與 xdata 關聯之圖層的名稱。</FONT>
<FONT style="BACKGROUND-COLOR: #f3f3f3">資料庫處理碼</FONT>
<FONT style="BACKGROUND-COLOR: #f3f3f3">1005. 圖面資料庫內某圖元的處理碼。</FONT>
<FONT style="BACKGROUND-COLOR: #f3f3f3">3D 點</FONT>
<FONT style="BACKGROUND-COLOR: #f3f3f3">1010. 一個點所包含的三個實數值。</FONT>
<FONT style="BACKGROUND-COLOR: #f3f3f3">實數</FONT>
<FONT style="BACKGROUND-COLOR: #f3f3f3">1040. 一個實數值。</FONT>
<FONT style="BACKGROUND-COLOR: #f3f3f3">整數</FONT>
<FONT style="BACKGROUND-COLOR: #f3f3f3">1070. 一個 16 位元整數(帶正負號或不帶正負號)。</FONT>
<FONT style="BACKGROUND-COLOR: #f3f3f3">長整數</FONT>
<FONT style="BACKGROUND-COLOR: #f3f3f3">1071. 一個 32 位元帶正負號 (long) 整數。如果出現在 1071 群組中的值是一個short整數或實數值,它會被轉換成long 整數;如果它是無效的(例如字串),則會被轉換成 long zero (<BR>0L)。<BR>注意 AutoLISP 是以實數值管理 1071 群組。如果您使用 entget 來取出包含 1071 群組之圖元的定義串列,則此值會以實數傳回,如下例所示:<BR>(1071 . 12.0)<BR>如果您要使用 entmake 或 entmod 在圖元內建立 1071 群組,您可以使用實數或整數值,如下例所示:</FONT>
<FONT style="BACKGROUND-COLOR: #f3f3f3">(entmake '((..... (1071 . 12) .... )))<BR>(entmake '((..... (1071 . 12.0) .... )))<BR>(entmake '((..... (1071 . 65537.0) .... )))<BR>(entmake '((..... (1071 . 65537) .... ))) <BR>但是 AutoLISP 仍以實數傳回群組值:<BR>(entmake '((..... (1071 . 65537) .... ))) <BR>前一個陳述式會傳回下式:<BR>(1071 . 65537.0) <BR>ObjectARX 一律以長整數管理 1071 群組。</FONT>
<FONT style="BACKGROUND-COLOR: #f3f3f3">數個其它的延伸資料群組在此環境中具有特殊意義(如果應用程式選擇使用它們):</FONT>
<FONT style="BACKGROUND-COLOR: #f3f3f3">控制字串</FONT>
<FONT style="BACKGROUND-COLOR: #f3f3f3">1002. xdata 控制字串可為 "{" 或 "}"。這些括弧可讓應用程式藉由將其資料子分割成串列來加以編排。左括弧是串列的開頭,右括弧則終止最近的串列。串列可套疊。<BR>注意 如果串列內出現 1001 群組,它會被視為一個字串,且不 會開始新的應用程式群組。</FONT>
<FONT style="BACKGROUND-COLOR: #f3f3f3">二進位資料</FONT>
<FONT style="BACKGROUND-COLOR: #f3f3f3">1004. 二進位資料被編制成可變長度的巨塊,其可使用 ads_binary 結構在 ObjectARX 處理。每一個巨塊的最大長度為 127 個位元組。<BR>注意 AutoLISP 無法直接處理巨塊,因此適用於long (1071) 群組的預警也適用於二進位群組。</FONT>
<FONT style="BACKGROUND-COLOR: #f3f3f3">世界空間位置</FONT>
<FONT style="BACKGROUND-COLOR: #f3f3f3">1011. 與簡式 3D 點不同的是,WCS 座標是隨著延伸資料所屬的上代圖元移動、調整比例、旋轉和鏡射。當 STRETCH 指令應用到上代圖元,且當此點落在窗選內時,也會拉伸 WCS <BR>位置。</FONT>
<FONT style="BACKGROUND-COLOR: #f3f3f3">世界空間位移</FONT>
<FONT style="BACKGROUND-COLOR: #f3f3f3">1012. 隨著上代調整比例、旋轉或鏡射,但不拉伸或移動的 3D 點。</FONT>
<FONT style="BACKGROUND-COLOR: #f3f3f3">世界方向</FONT>
<FONT style="BACKGROUND-COLOR: #f3f3f3">1013. 隨著上代旋轉或鏡射,但不調整比例、拉伸或移動的 3D 點。WCS 方向是制式化的位移,其永遠都有一個單位長度。</FONT>
<FONT style="BACKGROUND-COLOR: #f3f3f3">距離</FONT>
<FONT style="BACKGROUND-COLOR: #f3f3f3">1041. 隨著上代圖元調整比例的一個實數值。</FONT>
<FONT style="BACKGROUND-COLOR: #f3f3f3">比例係數</FONT>
<FONT style="BACKGROUND-COLOR: #f3f3f3">1042. 也是隨著上代調整比例的一個實數值。</FONT>
<FONT style="BACKGROUND-COLOR: #f3f3f3">xdata 的 DXF 群組碼也在「DXF 參考手冊」中說明。</FONT><BR> 我重新整理一下程序如下:
(defun C:drt ()<BR> (setq roomnam (ssget '((0 . "mtext"))))<BR> (setq roomnam (ssname roomnam 0))<BR> (setq room roomnam)<BR> (setq roomnam (entget roomnam)) ;获得最新图元的定义数据的关联表<BR> (setq pt (assoc 10 roomnam))<BR> (setq pt (list (nth 1 pt) (nth 2 pt)))<BR>;;;;;;;;开始求出房间面积<BR> (setvar "cecolor" "1")<BR> (command "bpoly" pt "")<BR> (setq en (entlast))<BR> (if (/= en nil)<BR> (progn<BR> (command "area" "o" en)<BR> (setq aa (getvar "area"))<BR> (redraw en 3)<BR> (entdel en)<BR> )<BR> )<BR> (setq area (/ aa 1000000)) ;求出面积<BR> (setq roomh 2.5) ;房间层高<BR> (setq timh 25.0) ;换气次数<BR> (setq fl (* (* area roomh) timh))<BR>;;;;;;;;结束求出房间面积<BR> (setq appdata (list "面积" "换气次数" "送风量" "风口类型" "风口数量"))<BR> (setq listdata (list area timh fl 500.0 500.0))<BR> (princ "\n数据表为:")<BR> (princ listdata)<BR> (setq i 0)<BR> (repeat 5<BR> (progn<BR> (setq appname (nth i appdata))<BR> (setq data (nth i listdata))<BR> (regapp appname) ;注册应用名称 (面积)<BR> (setq<BR> exdata<BR> (list<BR> (append<BR> (list -3)<BR> (list<BR> (append (list appname)<BR> (list (cons 1000 (rtos data)))<BR> )<BR> )<BR> )<BR> )
)<BR> (setq newent (append roomnam exdata)) ;在图元的表中增加新的表 <BR> (entmod newent)<BR> (setq roomnam newent)<BR> (setq i (+ i 1))<BR> (princ "\n数据为:")<BR> (princ data)<BR> )<BR> )<BR>)<BR>(defun C:drtt ()<BR> (setq roomnam (ssget '((0 . "mtext"))))<BR> (setq roomnam (ssname roomnam 0))<BR> (setq appdata (list "面积" "换气次数" "送风量" "风口类型" "风口数量"))<BR> (setq i 0) ;(princ appname)<BR> (repeat 5<BR> (progn<BR> (setq appname (nth i appdata))<BR> (setq xda (getxdata roomnam appname))<BR> (princ "\n")<BR> (princ appname)<BR> (princ "为:")<BR> (princ xda)<BR> (setq i (+ i 1))<BR> )<BR> )<BR> )
;;;;;;;;;;;;;;检索扩展数据<BR>;;;例如:(getx (entlast) "面积")<BR>;;;;;entname为有效的图形实体名,appname为已登记的应用类型名<BR>;;;;;若检索成功则以LIST表的形式返回指定的扩展数据,否则返回nil<BR>;;;返回:((1000."16Mn") (1040.32.45))<BR>(defun getxdata (entname appname / x0 x1)<BR> ;(setq appname (strcase appname))<BR> (if (= (type entname) 'ENAME)<BR> (if (tblsearch "APPID" appname)<BR> (progn<BR> (setq x1 (list appname))<BR> (if (setq x0 (assoc -3 (entget entname x1)))<BR> (cdr (assoc appname (cdr x0)))<BR> )<BR> )<BR> )<BR> )<BR>)
程序中DRT为对文字进行添加扩展数据,DRTT为读出扩展数据,
LISTDATA列表中的内容为添加的扩展数据内容,具体数据暂定为程序中的内容,
程序运行后用DRTT查扩展数据,只有面积一项有内容,其余均为NIL,不知何故?
请各位大侠指教!!<BR> 谢谢指教,因为扩展数据添加太难,经翻书现采用
VLAX-LDATA-PUT函数来添加数据
VLAX-LDATA-GET函数来读取数据
如有谁感兴趣的话我将程序改好后上传供大家参考
页:
[1]
2