明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 6921|回复: 16

[求助]扩展数据的添加

  [复制链接]
发表于 2004-2-20 16:09:00 | 显示全部楼层 |阅读模式
(setq roomnam (ssget '((0 . "mtext"))))
(setq roomnam (ssname roomnam 0))
(setq room roomnam)
(setq roomnam (entget roomnam)) ;获得最新图元的定义数据的关联表
(setq pt (assoc 10 roomnam))
(setq pt (list (nth 1 pt) (nth 2 pt)))

(setq area (/ aa 1000000)) ;aa是由其它程序求出的
(regapp "面积") ;注册应用名称 (面积)
(setq exdata '((-3
("面积"
(cons 1000 area)

)
)
)
)
(princ exdata)
(setq newent (append roomnam exdata)) ;在图元的表中增加新的表
(entmod newent) 本想利用该程序在文字上添加扩展数据(如房间面积、长、宽等数据) 可出现错误,请各位指教!
发表于 2004-2-20 16:38:00 | 显示全部楼层
(defun C:TT ()
(setq ROOMNAM (ssget '((0 . "mtext"))))
(setq ROOMNAM (ssname ROOMNAM 0))
(setq ROOM ROOMNAM)
(setq ROOMNAM (entget ROOMNAM)) ;獲得最新圖元的定義資料的關聯表
(setq PT (assoc 10 ROOMNAM))
(setq PT (list (nth 1 PT) (nth 2 PT)))
(setq AREA (/ 100.0 1000000)) ;aa是由其他程式求出的
;(regapp "面積") ;註冊應用名稱 (面積)
(setq
EXDATA (list
(append
(list -3)
(list
(append (list "面積") (list (cons 1000 (rtos AREA))))
)
)
)
)
(princ EXDATA)
(setq NEWENT (append ROOMNAM EXDATA)) ;在圖元的表中增加新的表
(entmod NEWENT)
)
发表于 2004-2-20 17:35:00 | 显示全部楼层
请问楼主增加属性表如何能够导出去呢,增加属性无非也就是要建数据库呀。
发表于 2004-2-20 21:18:00 | 显示全部楼层
不好意思,lucas。我拖动页面的时候不小心点中了你的鸡蛋。我补了朵鲜花给你作为补偿:)


sorry。
 楼主| 发表于 2004-2-22 10:37:00 | 显示全部楼层

再次请教扩展数据

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

本帖子中包含更多资源

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

x
 楼主| 发表于 2004-3-3 14:01:00 | 显示全部楼层
谢谢指教,因为扩展数据添加太难,经翻书现采用


VLAX-LDATA-PUT函数来添加数据


VLAX-LDATA-GET函数来读取数据


如有谁感兴趣的话我将程序改好后上传供大家参考
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-20 12:48 , Processed in 0.429689 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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