Lấy ư tưởng từ bài viết ánh xạ text của bác NguyenHoanh và lisp ánh xạ text của anh Giabach. Ḿnh vận dụng để viết một lisp để có thể tính toán trên các ánh xạ text này. Hy vọng nó sẽ giúp cho các bạn trong công việc:
CODE
;;;====================================================================
========================
;;;-------------------LINK GIA TRI CUA DOI TUONG NAY DEN DOI TUONG TEXT KHAC (>=cad2006)-------------------
;;;=============================================================================
===============
(vl-load-com)
;;;----------------------------------------
;;;LINK CHIEU DAI
(defun C:LL (/ obn Tkq)
(START_PG)
(setq obn (vlax-ename->vla-object (car (entsel "\nChon doi tuong nguon")))
obd (vlax-ename->vla-object (car (nentsel "\nChon text ghi chieu dai")))
ltr (I_INT0 "\n Nhap chu so lam tron" ltr)
hso (I_REAL "\n Nhap he so nhan" hso)
Tkq (strcat "%<\\AcObjProp Object(%<\\_ObjId "
(rtos (vla-get-objectid obn) 2 0)">%).Length \\f \"%lu2"
"%pr" (rtos ltr 2 0) "%ct8[" (rtos hso 2 0) "]" "\">%"
)
;ida (strcat "%<\\AcObjProp.16.2 Object(%<\\_ObjId "
;(rtos (vla-get-objectid obn) 2 0) ">%).Length \\f \"%lu2%pr2%ct8[1]\">%")
;ew (vlax-vla-object->ename (vla-objectidtoobject (vla-get-activedocument (vlax-get-acad-object))
;(vla-get-ownerid obd)))
)
(vla-put-textstring obd Tkq)
;(redraw ew 3)
;(entupd ew)
;(vla-update obw)
(vl-cmdf "regen")
(END_PG)
(princ)
)
;;;----------------------------------------
;;;LINK GIA TRI
(defun C:LGT (/ obn Tkq)
(START_PG)
(setq obn (vlax-ename->vla-object (car (nentsel "\nChon doi tuong nguon")))
obd (vlax-ename->vla-object (car (nentsel "\nChon text dich")))
Tkq (strcat "%<\\AcObjProp Object(%<\\_ObjId "
(rtos (vla-get-objectid obn) 2 0)
">%).TextString>%"
)
)
(vla-put-textstring obd Tkq)
(vla-update obd)
(vl-cmdf "regen")
(END_PG)
(princ)
)
;;;----------------------------------------
;;;LINK TONG
(defun C:LC (/ obn Lob Tgt)
(START_PG)
(setq ltr (I_INT0 "\n Nhap chu so lam tron" ltr)
Tgt "%<\\AcExpr (0")
(foreach obn (setq Lob (ES_ENT_LMP "\nChon cac Gia tri can tinh tong/ENTER de ket thuc chon..."))
(setq Tgt (strcat Tgt "+"
"%<\\AcObjProp Object(%<\\_ObjId "
(rtos (vla-get-objectid (vlax-ename->vla-object obn)) 2 0)
">%).TextString>%"
)
)
)
(setq Tgt (strcat Tgt ") \\f \"%lu2%pr" (itoa ltr) "\">%"))
(EX_VALUE_T_P_L Tgt (car Lob))
(vl-cmdf "regen")
(END_PG)
(princ)
)
;;;----------------------------------------
;;;LINK TICH
(defun C:LN (/ Tgt obn Lob)
(START_PG)
(setq ltr (I_INT0 "\n Nhap chu so lam tron" ltr)
Tgt "%<\\AcExpr (1")
(foreach obn (setq Lob (ES_ENT_LMP "\nChon cac Gia tri can tinh tich/ENTER de ket thuc chon..."))
(setq Tgt (strcat Tgt "*"
"%<\\AcObjProp Object(%<\\_ObjId "
(rtos (vla-get-objectid (vlax-ename->vla-object obn)) 2 0)
">%).TextString>%"
)
)
)
(setq Tgt (strcat Tgt ") \\f \"%lu2%pr" (itoa ltr) "\">%"))
(EX_VALUE_T_P_L Tgt (car Lob))
(vl-cmdf "regen")
(END_PG)
(princ)
)
;;;----------------------------------------
;;;LINK HIEU
(defun C:LH (/ Tgt ent1 ent2)
(START_PG)
(setq ltr (I_INT0 "\n Nhap chu so lam tron" ltr))
(while (null (setq ss1 (ES_TM&D "\n Chon so bi tru..."))))
(while (null (setq ss2 (ES_TM&D "\n Chon so tru..."))))
(setq ent1 (car (C_S2L ss1))
ent2 (car (C_S2L ss2))
)
(setq Tgt (strcat "%<\\AcExpr ("
"%<\\AcObjProp Object(%<\\_ObjId "
(rtos (vla-get-objectid (vlax-ename->vla-object ent1)) 2 0)
">%).TextString>%"
"-" "%<\\AcObjProp Object(%<\\_ObjId "
(rtos (vla-get-objectid (vlax-ename->vla-object ent2)) 2 0)
">%).TextString>%" ") \\f \"%lu2%pr" (itoa ltr) "\"" ">%"
)
)
(EX_VALUE_T_P_L Tgt ent1)
(vl-cmdf "regen")
(END_PG)
(princ)
)
;;;----------------------------------------
;;;LINK CHIA
(defun C:L/ (/ Tgt ent1 ent2)
(START_PG)
(setq ltr (I_INT0 "\n Nhap chu so lam tron" ltr))
(while (null (setq ss1 (ES_TM&D "\n Chon so BI CHIA..."))))
(while (null (setq ss2 (ES_TM&D "\n Chon so CHIA.."))))
(setq ent1 (car (C_S2L ss1))
ent2 (car (C_S2L ss2))
)
(setq Tgt (strcat "%<\\AcExpr ("
"%<\\AcObjProp Object(%<\\_ObjId "
(rtos (vla-get-objectid (vlax-ename->vla-object ent1)) 2 0)
">%).TextString>%" "/"
"%<\\AcObjProp Object(%<\\_ObjId "
(rtos (vla-get-objectid (vlax-ename->vla-object ent2)) 2 0)
">%).TextString>%" ") \\f \"%lu2%pr" (itoa ltr) "\"" ">%"
)
)
(EX_VALUE_T_P_L Tgt ent1)
(vl-cmdf "regen")
(END_PG)
(princ)
)
;;;----------------------------------------
;;;LINK TONG
(defun C:LMH (/ Lst1 Lst2 Lst3 Tgt dem pt1 ob Tj) ;;;Link Multi Hang
(START_PG)
(setq 42pan (I_KEY "\n Tinh Cong/Nhan/CHia " "C N CH" 42pan)
ltr (I_INT0 "\n Nhap chu so lam tron" ltr)
hso (I_REAL "\n Nhap he so nhan" hso)
Lst1 (OD_SSY_DES_L (C_S2L (ES_TM "\nChon cot thu nhat...")))
Lst2 (OD_SSY_DES_L (C_S2L (ES_TM "\nChon cot thu hai...")))
Lst3 (OD_SSY_DES_L (C_S2L (S_TM "\nChon cot ket qua/ENTER de xuat ke qua...")))
Tgt "%<\\AcExpr (0"
dem 0
)
(if (null Lst3)
(while (null (setq pt1 (getpoint "\n X dat cot: "))))
)
(if (/= (length Lst1) (length Lst2))
(progn
(alert "So hang cua 2 cot khong bang nhau. Chon lai")
(exit)
)
)
(repeat (length Lst1)
(setq ent1 (nth dem Lst1)
ent2 (nth dem Lst2)
)
(if Lst3
(setq ent3 (nth dem Lst3))
(setq ent3 nil)
)
(setq dem (1+ dem))
(cond ( (= 42pan "C")
(setq Tgt (CALC_LINK ent1 ent2 "+" ltr hso))
)
( (= 42pan "N")
(setq Tgt (CALC_LINK ent1 ent2 "*" ltr hso))
)
( (= 42pan "CH")
(setq Tgt (CALC_LINK ent1 ent2 "/" ltr hso))
)
)
(if (/= ent3 nil)
(progn
(setq ob (entget ent3))
(entmod (subst (cons 1 Tgt) (assoc 1 ob) ob))
)
(progn
(if (and (= (cadr (assoc 11 (entget ent1))) 0.0)
(= (caddr (assoc 11 (entget ent1))) 0.0)
)
(setq Tj 10)
(setq Tj 11)
)
(setq ent1 (entget ent1)
pt1 (list (car pt1) (caddr (assoc Tj ent1)))
)
(entmakex (list '(0 . "TEXT")
'(100 . "AcDbEntity")
(assoc 8 ent1)
'(100 . "AcDbText")
(cons Tj pt1)
(assoc 40 ent1)
(cons 1 Tgt)
(assoc 50 ent1)
(assoc 41 ent1)
(assoc 51 ent1)
(assoc 7 ent1)
(assoc 71 ent1)
(assoc 72 ent1)
'(100 . "AcDbText")
(assoc 73 ent1)
)
)
)
)
)
(vl-cmdf "regen")
(END_PG)
(princ)
)
;;;=============================================================================
===============
;;;---------------------------------PHEP TINH TOAN VOI LINK------------------------------------
;;;=============================================================================
===============
(defun CALC_LINK (ent1 ent2 ptinh ltr hso)
(strcat "%<\\AcExpr ("
"%<\\AcObjProp Object(%<\\_ObjId "
(rtos (vla-get-objectid (vlax-ename->vla-object ent1)) 2 0)
">%).TextString>%"
ptinh
"%<\\AcObjProp Object(%<\\_ObjId "
(rtos (vla-get-objectid (vlax-ename->vla-object ent2)) 2 0)
">%).TextString>%" ") \\f \"%lu2" "%pr" (itoa ltr)
"%ct8[" (rtos hso 2 5) "]\"" ">%"
)
)
(defun OWNER_ENAME (obn)
(vlax-vla-object->ename
(vla-objectidtoobject
(vla-get-activedocument (vlax-get-acad-object))
(vla-get-ownerid
(vlax-ename->vla-object obn)
)
)
)
)
;;;HAM BAY LOI
(defun INIT ()
(setq OLD_ERROR *error*
*error* MYERROR
)
(command "Undo" "begin")
)
(defun MYERROR (errmsg)
(cond
((= errmsg "quit / exit abort")
(princ)
)
((/= errmsg "Function cancelled")
(princ (strcat "\n Co loi: " errmsg))
)
)
(setvar "osmode" OLD_OSMODE)
(setvar "AUTOSNAP" OLD_AUTOSNAP)
(setvar "ORTHOMODE" OLD_ORTHOMODE)
(setvar "DIMZIN" OLD_DIMZIN)
(setvar "clayer" OLD_CLAYER)
(setvar "CECOLOR" OLD_CECOLOR)
(setvar "cmdecho" 1)
(command "Undo" "end")
(DONE)
(prompt "\n Da Reset lai thiet lap ban dau")
)
(defun DONE ()
(if OLD_ERROR
(setq *error* OLD_ERROR)
)
)
;;;----------------------------------------------------------
;;;HAM LUU BAT DAU VA KET THUC CHUONG TRINH
(C:EXPRESSTOOLS)
(defun START_PG (/ ss)
(setq ss (ssget "I"))
(INIT)
(sssetfirst nil ss)
)
(defun END_PG ()
(DONE)
(RESTORE)
)
;;;----------------------------------------------------------
;;;HAM LUU VA TRA LAI CAC THONG SO BAN DAU
(defun SAVE_MODE ()
(setvar "cmdecho" 0)
(command "Undo" "begin")
(command "UCS" "W")
(setq OLD_OSMODE (getvar "OSMODE")
OLD_CECOLOR (getvar "CECOLOR")
OLD_AUTOSNAP (getvar "AUTOSNAP")
OLD_ORTHOMODE (getvar "ORTHOMODE")
OLD_CLAYER (getvar "clayer")
OLD_DIMZIN (getvar "DIMZIN")
)
(setvar "DIMZIN" 0)
)
(defun RESTORE ()
(setvar "osmode" OLD_OSMODE)
(setvar "AUTOSNAP" OLD_AUTOSNAP)
(setvar "ORTHOMODE" OLD_ORTHOMODE)
(setvar "DIMZIN" OLD_DIMZIN)
(setvar "clayer" OLD_CLAYER)
(setvar "CECOLOR" OLD_CECOLOR)
(command "Undo" "end")
(setvar "cmdecho" 1)
(Grtext -1 "Copyright by Nataca - 0983.715.333")
)
;;;------------------------------------------
;;;NHAP GIA TRI LA SO NGUYEN ( BAO GOM CA SO 0)
(defun I_INT0 (dongnhac Tso)
(if (null Tso)
(progn
(initget (+ 1 4))
(getint (strcat dongnhac " >:"))
)
(progn
(cond
((progn
(initget 4)
(getint (strcat dongnhac " < " (itoa Tso) " >:"))
)
)
(T Tso)
)
)
)
)
;;;NHAP GIA TRI LA SO THUC
(defun I_REAL (dongnhac Tso / Tso1)
(if (null Tso)
(progn
(initget (+ 1 2))
(setq Tso (getdist (strcat dongnhac " >:")))
(princ (strcat "\nGia tri vua nhap la: " (rtos Tso 2 5)))
Tso
)
(progn
(cond
((progn
(initget (+ 2))
(setq Tso1 (getdist (strcat dongnhac " < " (rtos Tso 2 5) " >:")))
(if Tso1
(progn
(princ (strcat "\nGia tri vua nhap la: " (rtos Tso1 2 5)))
(setq Tso Tso1)
)
)
)
)
(T Tso)
)
)
)
)
;;;------------------------------------------
;;;CHON LIEN TIEP NHIEU DOI TUONG THEO PHUONG PHAP PICK KEM DONG NHAC (BAT BUOC CHON)
(defun ES_ENT_LMP (dongnhac / Lsel sel mouse ew) ;;;LMP = List Multi Pick
(prompt dongnhac)
(while (/= (car mouse) 2)
(setq mouse (grread 0 15 2))
(if (= (car mouse) 3)
(if (setq sel (car (nentselp (cadr mouse))))
(progn
(setq Lsel (append Lsel (list sel)))
(princ (strcat "\n" (itoa (length Lsel))
" doi tuong duoc pick chon/ENTER ke ket thuc chon"))
)
(princ "\nChon chua dung!")
)
)
)
Lsel
)
;;;------------------------------------------
;;;XUAT/EDIT KET QUA VOI TEXT MAU BANG CACH PICK DIEM (EDIT CA ATTRIBUTE, DUNG CHO LINK GIA TRI)
(defun EX_VALUE_T_P_L (Tkq Tmau / mouse sel pt1 ob kq1 Elst Tj caoText oldTsize oldTstyle)
;;;Real+interge
(prompt "\n Chon text chua kq / An enter de viet text kq...")
(while (and (/= (car mouse) 2) (null sel))
(setq mouse (grread 0 15 2))
(if (= (car mouse) 3)
(if (null (setq sel (car (nentselp (cadr mouse)))))
(princ "\nChon chua dung! Chon lai...")
)
)
)
(if (/= sel nil)
(progn
(setq ob (entget sel))
(entmod (subst (cons 1 Tkq) (assoc 1 ob) ob))
)
(progn
(while (null (setq pt1 (getpoint "\n Diem dat text: "))))
(if Tmau
(progn
(if (and (= (cadr (assoc 11 (entget Tmau))) 0.0)
(= (caddr (assoc 11 (entget Tmau))) 0.0)
)
(setq Tj 10)
(setq Tj 11)
)
(setq Tmau (entget Tmau))
(entmakex (list '(0 . "TEXT")
'(100 . "AcDbEntity")
(assoc 8 Tmau)
'(100 . "AcDbText")
(cons Tj pt1)
(assoc 40 Tmau)
(cons 1 Tkq)
(assoc 50 Tmau)
(assoc 41 Tmau)
(assoc 51 Tmau)
(assoc 7 Tmau)
(assoc 71 Tmau)
(assoc 72 Tmau)
'(100 . "AcDbText")
(assoc 73 Tmau)
)
)
)
)
)
)
)
;;;------------------------------------------
;;;CHON TEXT VA DIMENSION KEM DONG NHAC (BAT BUOC CHON)
(defun ES_TM&D (dongnhac / ss)
(while (and(not (prompt dongnhac))
(not (or (setq ss (ssget "I" '((0 . "*TEXT,DIMENSION"))))
(setq ss (ssget '((0 . "*TEXT,DIMENSION"))))
)
)
)
)
ss
)
;;;CHUYEN BIEU DIEN TAP HOP DOI TUONG DUOI DANG LIST CHUA ENAME CUA CAC DOI TUONG
(defun C_S2L (ss)
(if ss
(vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
nil
)
)
;;;------------------------------------------
;;;NHAP KEY VAO
(defun I_KEY (dongnhac key Text)
(if (null Text)
(progn
(initget 1 key)
(getkword (strcat dongnhac " :"))
)
(progn
(cond
((progn
(initget key)
(getkword (strcat dongnhac " < " Text " >:"))
)
)
(T Text)
)
)
)
)
(defun OD_SSY_DES_L (Lst)
(setq lst (vl-sort lst '(lambda (e1 e2)
(>
(caddr (assoc
(if (and (= (cadr (assoc 11 (entget e1))) 0.0)
(= (caddr (assoc 11 (entget e1))) 0.0)
)
10
11
)
(entget e1)
)
)
(caddr (assoc
(if (and (= (cadr (assoc 11 (entget e2))) 0.0)
(= (caddr (assoc 11 (entget e2))) 0.0)
)
10
11
)
(entget e2)
)
)
)
)
)
)
)
;;;------------------------------------------
;;;CHON TEXT, MTEXT KEM DONG NHAC (BAT BUOC CHON)
(defun ES_TM (dongnhac / ss)
(while (and (not (prompt dongnhac))
(not (or (setq ss (ssget "I" '((0 . "*TEXT"))))
(setq ss (ssget '((0 . "*TEXT"))))
)
)
)
)
ss
)
;;;CHON TEXT, MTEXT KEM DONG NHAC
(defun S_TM (dongnhac / ss)
(prompt dongnhac)
(if (null (setq ss (ssget "I" '((0 . "*TEXT")))))
(setq ss (ssget '((0 . "*TEXT"))))
)
ss
)
-Lệnh LL (link length): để link giá trị chiều dài của 1 đối tượng vào text (khi chiều dài đối tượng thay đổi th́ giá trị text thay đổi theo)
-Lệnh LGT (link giá trị): để link giá trị của 1 text này cho text khác (khi giá trị text nguồn thay đổi th́ giá trị text đích tự cập nhật theo)
-Lệnh LC (link cộng): Pick chọn các số lần lượt sau đó chọn text kết quả th́ sẽ tính tổng các giá trị đó (một trong các giá trị nguồn thay đổi th́ giá trị tổng thay đổi theo)
-Lệnh LN (link nhân ): Pick chọn các số lần lượt sau đó chọn text kết quả th́ sẽ tính tích các giá trị đó (một trong các giá trị nguồn thay đổi th́ giá trị tích thay đổi theo)
-Lệnh LH (link hiệu): Quét chọn text số bị trừ, quét chọn số trừ, chọn text giá trị hiệu (một trong các giá trị nguồn thay đổi th́ giá trị hiệu thay đổi theo)
-Lệnh L/ (link chia): Quét chọn text số bị chia, quét chọn số chia, chọn text giá trị thương (một trong các giá trị nguồn thay đổi th́ giá trị thương thay đổi theo)
-Lệnh LMH (link multi hàng): Tính toán cho nhiều hàng text. Chọn phép tính, chọn cột 1, cột 2...sau đó chọn cột giá trị (trong này có hệ số nhân để tiện khi đổi đơn vị trong lập bảng thống kê)
Đây là file lisp: lisp tính toán với link
Đây là file .vlx đă được biên dịch: tính toán với linkXin phép bác Nacata sắp xếp lại code để việc hiển thị trang viết được thuận tiện hơn cho người đọc.