cad lisp 背景遮罩_给文字批量添加边界偏移因子为1.1(或其他值)的背景遮罩的源程序(有详细注解)...
本帖最后由 作者 于 2007-11-6 9:06:55 編輯
CAD2005以后版本中就有了背景遮罩功能,但其默認值為1.5多數情況下不太合適
在Autodesk官方網站技術支持知識庫查詢,其中關于多行文字的背景遮罩邊界偏移因子默認值修改的問題(問題ID號TS1059918),其解釋為“In the Background Mask dialog box, the default value for the Border Offset factor is 1.5000. In current AutoCAD? releases, it is not possible to define a different default value for this setting.”意為在背景遮罩對話框中,邊界偏移因子的默認值為1.5,在當前的AutoCAD版本中,該默認值是不能修改的。
所以寫了此程序
解決問題的基本思路為:選取文本>若是單行文本,先轉換為多行文本>若多行文本已啟用背景遮罩功能,修改其邊界偏移因子為1.1,填充顏色使用圖形背景顏色;若未啟用,增加該功能,設定其邊界偏移因子為1.1,填充顏色使用圖形背景顏色。
我加上了詳細注解,覺得有用的話拿去吧.
注意:單行文本轉多行文本時文本寬度的計算要選取適當系數
bg_mask.lsp
-----------------------------程序代碼--------------------------------------------
;這個lisp程序的作用是,將單行文本轉換為多行文本,為多行文本設置背景遮罩
;背景遮罩邊界偏移因子為1.1,使用圖形背景顏色填充。
;s1選擇集名稱,i m n 計數器,addlist增加的組碼
;entname 圖元名,nlist 圖元數據,tid 圖元標志(若為TEXT則表示為單行文本),tt 文本,th文本高度
;pt 文本基點,tang 文本旋轉角度,ttlen 文本大致長度,tstr 相對坐標形式的多行文本的另一點
(defun c:bg()
;首先要對圖形進行一些設置,否則將會影響程序的使用。在程序結束前將會恢復這些設置!
(setq sysosnap (getvar "OSMODE"))?;取得對象捕捉設置
(setvar "OSMODE" 16384)??;關閉對象捕捉
(setq sysang (getvar "ANGDIR"))?;取得角度方向(順時針/逆時針)
(setvar "ANGDIR" 0)???;設置為逆時針方向
(setq sysabase (getvar "ANGBASE"))?;取得方向的基準角度
(setvar "ANGBASE" 0)???;設置方向的基準角度為東
(command "ucs" "")???;設置為wcs
(setq s1 (ssget))????;選取單行文本或多行文本,構造非空選擇集
(if (/= s1 nil) (print) ???;構造選擇集成功,繼續
(progn ?????;構造失敗,恢復設置退出
(setvar "OSMODE" sysosnap)??;恢復對象捕捉設置
(setvar "ANGDIR" sysang)??;恢復角度方向
(setvar "ANGBASE" sysabase)??;恢復方向的基準角度
(command "ucs" "p")???;恢復ucs
(exit)????;退出
)
)
(setq i 0 m 0 n 0)????;設置計數器,m為轉換單行文本個數,n為多行文本個數
(repeat (sslength s1)
(setq entname (ssname s1 i))
(setq nlist (entget entname))
(setq tid (cdr (assoc 0 nlist)))??;判斷是單行文本或多行文本
(if (= tid "TEXT") ????;如果是單行文本,先轉換為多行文本
(progn
(setq m (1+ m))????;計數器
(setq tt (cdr (assoc 1 nlist)))??;取得文字
(setq th (cdr (assoc 40 nlist)))??;取得文字高度
(setq pt (cdr (assoc 10 nlist)))??;取得文字插入點
(setq ang (cdr (assoc 50 nlist)))??;取得文字旋轉角度
(setq ttlen (strlen tt))???;取得文字長度
(setq twid (* (* th 0.7) ttlen))??;計算文字寬度,不同字體、CAD版本、圖形,文字高度與寬度關系可能不同,可直接修改系數0.7為適當值
(setq tang (/ (* 180 (+ ang (atan(/ th twid)))) pi))?;計算多行文本對角點的旋轉角度
(setq tlen (sqrt (+ (* th? th) (* twid twid))))??;計算多行文本對角線的長度
(setq tstr (strcat "@" (rtos tlen) "
(setq ang (/ (* ang 180) pi))????;轉換弧度為角度
(command "-mtext" pt "h" th "r" ang tstr tt "")??;在原位置以原角度原高度生成多行文本
(entdel entname)??????;刪除單行文本
(setq entname (entlast))???;取出最近轉換成的多行文本
(setq nlist (entget entname))
(setq addlist (list(cons 45 1.1)))??;背景遮罩邊界偏移因子為1.1
(setq addlist (cons (cons 63 256) addlist));填充顏色使用圖形背景顏色
(setq addlist (cons (cons 90 3) addlist))?;表示使用背景顏色,另外組碼441為背景的透明度,目前版本無法使用,系統會自動增加該組碼
(if (= (assoc 45 nlist) nil) ??;如果多行文本未使用背景遮罩,增加組碼
(progn
(setq nlist (append nlist addlist))?;增加上面3個組碼
(entmod nlist)???;更新顯示
)
(progn?????;如果已使用背景遮罩,直接更改組碼
(setq nlist (subst (cons 45 1.1) (assoc 45 nlist) nlist)) ;作用同上
(setq nlist (subst (cons 63 256) (assoc 63 nlist) nlist))
(setq nlist (subst (cons 90 3) (assoc 90 nlist) nlist))
(entmod nlist)
)
)
)
(progn
(if (= tid "MTEXT") ?????;如果是多行文本
(progn
(setq n (1+ n))?????;計數器
(setq addlist (list(cons 45 1.1)))??;背景遮罩邊界偏移因子為1.1
(setq addlist (cons (cons 63 256) addlist))?;填充顏色使用圖形背景顏色
(setq addlist (cons (cons 90 3) addlist))?;表示使用背景顏色,另外組碼441為背景的透明度,目前版本無法使用,系統會自動增加該組碼
(if (= (assoc 45 nlist) nil) ???;如果多行文本未使用背景遮罩,增加組碼
(progn
(setq nlist (append nlist addlist))?;增加上面3個組碼
(entmod nlist)????;更新顯示
)
(progn?????;如果已使用背景遮罩,直接更改組碼
(setq nlist (subst (cons 45 1.1) (assoc 45 nlist) nlist)) ;作用同上
(setq nlist (subst (cons 63 256) (assoc 63 nlist) nlist))
(setq nlist (subst (cons 90 3) (assoc 90 nlist) nlist))
(entmod nlist)
)
)
)
)
)
)
(setq i (1+ i))
)
(setvar "OSMODE" sysosnap)??;恢復對象捕捉設置
(setvar "ANGDIR" sysang)??;恢復角度方向
(setvar "ANGBASE" sysabase)??;恢復方向的基準角度
(command "ucs" "p")???;恢復ucs
(prompt (strcat "轉換單行文本" (itoa m) "個,多行文本" (itoa n) "個。請驗證是否正確!"))
)
--------------------------------------------------------------------------------------------------
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的cad lisp 背景遮罩_给文字批量添加边界偏移因子为1.1(或其他值)的背景遮罩的源程序(有详细注解)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ajax请求携带tooken_使用aja
- 下一篇: 小程序promise封装post请求_微