Chuyển đến nội dung
Diễn đàn CADViet

bach1212

Thành viên
  • Số lượng nội dung

    193
  • Đã tham gia

  • Lần ghé thăm cuối

Bài đăng được đăng bởi bach1212


  1.  

    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. Mì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:

    ;;;============================================================================================;;;-------------------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>" "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 link

     

    Xin 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.

     

     

    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. Mì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:

    ;;;============================================================================================;;;-------------------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>" "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 link

     

    Xin 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.

    Lisp rất hay. Nhưng e thấy tồn tại vấn đề như thế này:

    Khi chọn text trong tất cả các lệnh: các đối tượng text ko quét được mà phải chọn từng text một rất mất thời gian

    Lệnh LH: ko trừ được cho nhìu số trừ.

    Mong bác chỉnh sửa bổ sung thêm cho lisp hoàn thiện ah.

    Thanks

     


  2. Dùng lisp này xem
     

    ;; free lisp from cadviet.com
    ;;; this lisp was downloaded from http://www.cadviet.com/forum/index.php?showtopic=12103&st=20
    (defun c:dcs(/ tlv blm blname dmo cdm cd dm cdmi dmoc bl)
    (setvar "attreq" 1)
    (setvar "cmdecho" 0)
    (setq oldim (getvar "DimZin"))
    (setvar "Dimzin" 0)
    (setq tlv (/ 1 (getreal "\n Nhap ti le ve : 1/")))
    (setq bl (car(entsel "\n Pick chon Block mau / Text mau :")))
    (setq blm (entget bl))
    (setq dmo (getpoint "\n Pick diem moc : "))
    
    (setq cdm (getreal "\n Nhap cao do cua diem moc \ Enter pick text cao do : "))
    (if (null cdm) (setq cdm (atof (cdr(assoc 1 (entget(car (entsel "pick text cao do : ")))))))  )
    (if cdm (progn
    (if (= cdm 0) (setq cd (strcat "%%p" (rtos cdm 2 2))))
    (if (> cdm 0) (setq cd (strcat "+" (rtos cdm 2 2))))
    (if (< cdm 0) (setq cd (rtos cdm 2 2)))
    (setq dmoc dmo)
    (while (setq dm (getpoint dmoc "\n Pick diem tiep theo :"))
    (if (> (cadr dm) (cadr dmo))  (setq cdmi (+ (* (- (cadr dm) (cadr dmo)) tlv) cdm) ) )
    (if (<= (cadr dm) (cadr dmo))  (setq cdmi (- cdm (* (- (cadr dmo) (cadr dm)) tlv) ) ) )
    (if (= cdmi 0) (setq cdi (strcat "%%p" (rtos cdmi 2 2))))
    (if (> cdmi 0) (setq cdi (strcat "+" (rtos cdmi 2 2))))
    (if (< cdmi 0) (setq cdi (rtos cdmi 2 2)))
    (command "copy" bl "" "_non" (cdr(assoc 10 blm)) "_non" dm)
    (if (and (wcmatch (cdr(assoc 0 (entget (entlast)))) "INSERT") (= (cdr(assoc 66 (entget (entlast)))) 1))
     	(setq el (entget (entnext (entlast)) )))
    (if (wcmatch (cdr(assoc 0 (entget (entlast)))) "TEXT") (setq el (entget (entlast))) )
    (entmod (subst (cons 1 cdi) (assoc 1 el) el))
    (setq dmoc dm)
    )
    (setvar "Dimzin" oldim)
    ))
    (princ)
    )
    
    
    
    • Vote tăng 3

  3. : Ha Van Khanh 3/2003
    ;
    ; * Chuong trinh duoc lap bang ngon ngu AUTOLISP.
    ; ------------------------------------------------------------------------------
    (vmon)
    (defun C:bang (/ 1x 1y a1 2x 2y a2 3x 3y a3 b p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14  p15 p16x p16y p16 p17x p17y p17)
    (setvar "cmdecho" 0) 
    (initget 7)
    (setq osm (getvar "osmode" ))
    (setvar "osmode" 0)
    (command "-Style" "hoatbif" "hoatbif " "2.0" "" "" "" "" "")
    (command "-Layer" "n" "Text" "c" "4" "Text" "")
     (setq p1 (getpoint "\nChon diem dat bang thong ke :"))
     (setq S (getint "\nSo diem can tinh toa do :"))
    (setq p2 (polar p1 (/ (* Pi 3) 2) (+ 16 (* 8 S))))
    (setq p3 (polar p2 0 91))
    (setq p4 (polar p1 0 91))
    (setq p5 (polar p1 0 21))
    (setq p6 (polar p2 0 21))
    (setq p7 (polar p5 0 35))
    (setq p8 (polar p6 0 35))
    (setq p9 (polar p5 (/ (* Pi 3) 2) 8))
    (setq p10 (polar p4 (/ (* Pi 3) 2) 8))
    (setq p12 (polar p9 0 35))
    (setq p11 (polar p9 0 -10.5))
    (setq p13 (polar p1 (/ (* Pi 3) 2) 16))
    (setq p14 (polar p4 (/ (* Pi 3) 2) 16))
    (setq p15 (polar p7 (/ (* pi 3 ) 2) 4))
    (setq p16x (/ (+ (car p5) (car p7)) 2))
    (setq p16y (/ (+ (cadr p9) (cadr p13)) 2))
    (setq p17x (/ (+ (car p4) (car p7)) 2))
    (setq p17y (/ (+ (cadr p9) (cadr p13)) 2))
    (setq p16 (list p16x p16y))
    (setq p17 (list p17x p17y))
    (command "Plinewid" "0.5")
    (command "Pline" p1 p2 p3 p4 p1 "")
    (command "Line" p5 p6 "")
    (command "Line" p12 p8 "")
    (command "Line" p9 p10 "")
    (command "Line" p13 p14 "")
    (command "Array" "l" "" "Rec" S "1" "-8")
    (command "text" "j" "mc"  p11 "0"  "Tªn ga"  )
    (command "text" "j" "mc"  p15 "0"  "To¹ ®é" )
    (command "text" "j" "mc"  p16 "0"  "X" )
    (command "text" "j" "mc"  p17 "0"  "Y" )
    (setvar "osmode" 1)
    ;-------------------------------------------------
    ; PhÇn sö lý ch÷
    (setq b 0)
    (while (< b s )
    (setq b (+ b 1))
    (setq td (getstring "\Nhap ten diem lay toa do : "))
    (if (or (= td "") (= td " "))
    (setq td (cdr (assoc 1 (entget (car (entsel "\n Chon text san co tren ban ve"))))))
    )
    (setq tp (getpoint "\n Chon diem : "))
    (setq tx (rtos (car tp) 2 4 ))
    (setq ty (rtos (cadr tp) 2 4 ))
    (setq 1x (/ (+ (car p1) (car p5)) 2))
    (setq 1y (- (- (cadr p11) 4) (* 8 B)))
    (setq a1 (list 1x 1y))
    (setq 2x (/ (+ (car p5) (car p7)) 2))
    (setq 2y (- (cadr p16) (* 8 B)))
    (setq a2 (list 2x 2y))
    (setq 3x (/ (+(car p7) (car p4)) 2))
    (setq 3y (- (cadr p17) (* 8 B)))
    (setq a3 (list 3x 3y))
    (command "text" "j" "mc"  a1  "0"  td "" )
    (command "text" "j" "mc"  a3  "0"  tx "" )
    (command "text" "j" "mc"  a2  "0"  ty "" )
    )
    )
    
    

     

     

    Lisp trên để lấy tọa độ của 1 điểm.

    Cho e hỏi dòng lệnh nào quy định chế độ bắt điểm của lisp trên ah?


  4. em làm 3 tuyến trên đường . đã chạy hết trắc dọc và ngang 3 tuyến . nhưng khi muốn quay lại sửa tuyến thứ 1 đánh lệnh CS thì lại ko thấy tên tuyến 1 đâu để chọn làm hiện thời . mặc dù bản vẽ của tuyến 1 vẫn còn . giúp em mới các cao thủ ơi đây là link bản vẽ của em http://www.4shared.com/photo/kEqlNeBT/Drawing3.html?

    Lỗi này chưa gặp bao giờ. Chia buồn nhé. Chắc bạn thao tác nhẩm rồi. Chạy lại thôi. Các đối tượng thuộc tuyến 1 không nhận nữa rồi vì trong CS đã xóa mất


  5. Lisp đã wonderul. Đa tạ các cao nhân a hùng đã ra tay giúp đỡ. :P :D

    Đây là bản chỉnh sửa lần cuối, bạn nào cần lisp này như mình thì mời xơi ở đây nhé :D

    ;; free lisp from cadviet.com
    ;;; this lisp was downloaded from
    http://www.cadviet.com/forum/index.php?showtopic=12103&st=20
    (defun c:dcd(/ blname dmo cdm cd dm cdmi dmoc)
    (setvar "attreq" 1)
    (setvar "cmdecho" 0)
    (setq oldim (getvar "DimZin"))
    (setvar "Dimzin" 0)
    (or tlv (setq tlv (/ 1 (getreal "\n Nhap ti le ve : 1/"))))
    (or bl (setq bl (car(entsel "\n Pick chon Block mau / Text mau :"))))
    (or blm (setq blm (entget bl)))
    (setq dmo (getpoint "\n Pick diem moc : "))
    (setq cdm (getreal "\n Nhap cao do cua diem moc \ Enter pick text cao
    do : "))
    (if (null cdm) (setq cdm (atof (cdr(assoc 1 (entget(car (entsel "pick
    text cao do : ")))))))  )
    (if cdm (progn
    (if (= cdm 0) (setq cd (strcat "%%p" (rtos cdm 2 2))))
    (if (> cdm 0) (setq cd (strcat "+" (rtos cdm 2 2))))
    (if (< cdm 0) (setq cd (rtos cdm 2 2)))
    (setq dmoc dmo)
    (while (setq dm (getpoint dmoc "\n Pick diem tiep theo :"))
    (if (> (cadr dm) (cadr dmo))  (setq cdmi (+ (* (- (cadr dm) (cadr dmo))
    tlv) cdm) ) )
    (if (<= (cadr dm) (cadr dmo))  (setq cdmi (- cdm (* (- (cadr dmo) (cadr
    dm)) tlv) ) ) )
    (if (= cdmi 0) (setq cdi (strcat "%%p" (rtos cdmi 2 2))))
    (if (> cdmi 0) (setq cdi (strcat "+" (rtos cdmi 2 2))))
    (if (< cdmi 0) (setq cdi (rtos cdmi 2 2)))
    (command "copy" bl "" "_non" (cdr(assoc 10 blm)) "_non" dm)
    (if (and (wcmatch (cdr(assoc 0 (entget (entlast)))) "INSERT") (=
    (cdr(assoc 66 (entget (entlast)))) 1))
     (setq el (entget (entnext (entlast)) )))
    (if (wcmatch (cdr(assoc 0 (entget (entlast)))) "TEXT") (setq el (entget
    (entlast))) )
    (entmod (subst (cons 1 cdi) (assoc 1 el) el))
    (entupd (entlast))
    (setq dmoc dm)
    )
    (setvar "Dimzin" oldim)
    )))
    (princ)
    )
    
    


  6. Phần đỏ là bạn phải xóa đi

    Phần xanh là thêm vào

    Với code ở bài #24, đã sửa theo gợi ý của Ketxu. Nhưng chưa bớt được thao tác nhập ban đầu: chọn blog mẫu

    ;; free lisp from cadviet.com
    ;;; this lisp was downloaded from
    http://www.cadviet.com/forum/index.php?showtopic=12103&st=20
    (defun c:dcd(/ blname dmo cdm cd dm cdmi dmoc bl)
    (setvar "attreq" 1)
    (setvar "cmdecho" 0)
    (setq oldim (getvar "DimZin"))
    (setvar "Dimzin" 0)
    (or tlv (setq tlv (/ 1 (getreal "\n Nhap ti le ve : 1/"))))
    (or bl (setq bl (car(entsel "\n Pick chon Block mau / Text mau :"))))
    (or blm (setq blm (entget bl)))
    (setq dmo (getpoint "\n Pick diem moc : "))
    (setq cdm (getreal "\n Nhap cao do cua diem moc \ Enter pick text cao
    do : "))
    (if (null cdm) (setq cdm (atof (cdr(assoc 1 (entget(car (entsel "pick
    text cao do : ")))))))  )
    (if cdm (progn
    (if (= cdm 0) (setq cd (strcat "%%p" (rtos cdm 2 2))))
    (if (> cdm 0) (setq cd (strcat "+" (rtos cdm 2 2))))
    (if (< cdm 0) (setq cd (rtos cdm 2 2)))
    (setq dmoc dmo)
    (while (setq dm (getpoint dmoc "\n Pick diem tiep theo :"))
    (if (> (cadr dm) (cadr dmo))  (setq cdmi (+ (* (- (cadr dm) (cadr dmo))
    tlv) cdm) ) )
    (if (<= (cadr dm) (cadr dmo))  (setq cdmi (- cdm (* (- (cadr dmo) (cadr
    dm)) tlv) ) ) )
    (if (= cdmi 0) (setq cdi (strcat "%%p" (rtos cdmi 2 2))))
    (if (> cdmi 0) (setq cdi (strcat "+" (rtos cdmi 2 2))))
    (if (< cdmi 0) (setq cdi (rtos cdmi 2 2)))
    (command "copy" bl "" "_non" (cdr(assoc 10 blm)) "_non" dm)
    (if (and (wcmatch (cdr(assoc 0 (entget (entlast)))) "INSERT") (=
    (cdr(assoc 66 (entget (entlast)))) 1))
     (setq el (entget (entnext (entlast)) )))
    (if (wcmatch (cdr(assoc 0 (entget (entlast)))) "TEXT") (setq el (entget
    (entlast))) )
    (entmod (subst (cons 1 cdi) (assoc 1 el) el))
    (entupd (entlast))
    (setq dmoc dm)
    )
    (setvar "Dimzin" oldim)
    )))
    (princ)
    )
    
    


  7. Mình chạy thì không cần RE mà Block vẫn đổi giá trị

    Vậy bạn thêm dòng này :

    (entupd (entlast))

    xuống dưới dòng (entmod (subst (cons 1 cd) (assoc 1 el) el))

    và xuống dưới dòng : (entmod (subst (cons 1 cdi) (assoc 1 el) el))

    ở code lisp của bài viết số #24

    Bạn thử xem

    Các bác cho e hỏi: E muốn giữ lại tỉ lệ vẽ, và blog mẫu đã chọn để mỗi lần thực hiện lệnh lần tiếp theo không phải chọn lại tỉ lệ vẽ và blog mẫu thì xây dựng thêm code như thế nào ah?

    Khi kết thúc lệnh lần đầu và thực hiện lệnh tiếp tục sẽ bắt đầu ngay ở bước: Pick điểm mốc


  8. Lisp đầu trước khi sửa có bị tình trạng như vậy

    Lisp sau khi sửa ở bài viết số #24 chạy ok, không bị vậy nữa

     

     

    Tue_NV thử lisp chạy ở bài viết số #24 -> ok

    Thanks bác. E vừa tìm ra nguyên nhân. Blog insert ra theo lisp #24 rất chuẩn.

    Nhưng sau khi có kết quả phải re lại bản vẽ nó mới hiện lên cao độ của điểm mới. Lúc đầu e chọn blog mẫu xong, nhập cao độ mốc xong, thì vẫn thấy cao độ điểm mới bằng cao độ của blog mẫu. Hjj làm phiền bác Tuenv ngày chủ nhật vui vẻ roài. (Lúc đầu e lại ko có dùng re) :P :D


  9. ;; free lisp from cadviet.com
    ;;; this lisp was downloaded from http://www.cadviet.com/forum/index.php?showtopic=12103&st=0
    (defun c:dcs(/ tlv blm blname dmo cdm cd dm cdmi dmoc)
    (setvar "attreq" 1)
    (setvar "cmdecho" 0)
    (setq oldim (getvar "DimZin"))
    (setvar "Dimzin" 0)
    (setq tlv (/ 1 (getreal "\n Nhap ti le ve : 1/")))
    (setq blm (entget(car(entsel "\n Pick chon Block mau :"))))
    (setq blname (cdr(assoc 2 blm)))
    (setq TLX (cdr(assoc 41 blm)))
    (setq TLY (cdr(assoc 42 blm)))
    (setq dmo (getpoint "\n Pick diem moc : "))
    (setq cdm (getreal "\n Nhap cao do cua diem moc \ Enter pick text cao do : "))
    (if (null cdm) (setq cdm (atof (cdr(assoc 1 (entget(car (entsel "pick text cao do : ")))))))  )
    (if cdm (progn))
    (if (= cdm 0) (setq cd (strcat "%%p" (rtos cdm 2 2))))
    (if (> cdm 0) (setq cd (strcat "+" (rtos cdm 2 2))))
    (if (< cdm 0) (setq cd (rtos cdm 2 2)))
    ;(command "insert" blname dmo TLX TLY "0" cd)
    (setq dmoc dmo)
    (while (setq dm (getpoint dmoc "\n Pick diem tiep theo :"))
    (if (> (cadr dm) (cadr dmo))  (setq cdmi (+ (* (- (cadr dm) (cadr dmo)) tlv) cdm) ) )
    (if (<= (cadr dm) (cadr dmo))  (setq cdmi (- cdm (* (- (cadr dmo) (cadr dm)) tlv) ) ) )
    (if (= cdmi 0) (setq cdi (strcat "%%p" (rtos cdmi 2 2))))
    (if (> cdmi 0) (setq cdi (strcat "+" (rtos cdmi 2 2))))
    (if (< cdmi 0) (setq cdi (rtos cdmi 2 2)))
    (command "insert" blname dm TLX TLY "0" cdi)
    (setq dmoc dm)
    )
    (setvar "Dimzin" oldim)
    (princ)
    )
    
    

    Đoạn lisp trên e kết hợp 2 lần chỉnh sửa của bác Tuenv và đã cho ra kết quả đúng của dạng blog.

    Tuy nhiên khi blog insert ra thì lại bị scan nhỏ đi rất nhiều so với blog mẫu.

    Các bác cho e hỏi nguyên nhân tại sao lại như vậy?


  10. Tue_NV chỉnh sửa lại Lisp
     (defun c:dcd(/ tlv blm blname dmo cdm cd dm cdmi dmoc bl) (setvar "attreq" 1) (setvar "cmdecho" 0) (setq oldim (getvar "DimZin")) (setvar "Dimzin" 0) (setq tlv (/ 1 (getreal "\n Nhap ti le ve : 1/"))) (setq bl (car(entsel "\n Pick chon Block mau / Text mau :"))) (setq blm (entget bl)) (setq dmo (getpoint "\n Pick diem moc : ")) (setq cdm (getreal "\n Nhap cao do cua diem moc \ Enter pick text cao do : ")) (if (null cdm) (setq cdm (atof (cdr(assoc 1 (entget(car (entsel "pick text cao do : "))))))) ) (if cdm (progn (if (= cdm 0) (setq cd (strcat "%%p" (rtos cdm 2 3)))) (if (> cdm 0) (setq cd (strcat "+" (rtos cdm 2 3)))) (if (< cdm 0) (setq cd (rtos cdm 2 3))) (command "copy" bl "" "_non" (cdr(assoc 10 blm)) "_non" dmo) (if (and (wcmatch (cdr(assoc 0 (entget (entlast)))) "INSERT") (= (cdr(assoc 66 (entget (entlast)))) 1)) (setq el (entget (entnext (entlast)) ))) (if (wcmatch (cdr(assoc 0 (entget (entlast)))) "TEXT") (setq el (entget (entlast))) ) (entmod (subst (cons 1 cd) (assoc 1 el) el)) (setq dmoc dmo) (while (setq dm (getpoint dmoc "\n Pick diem tiep theo :")) (if (> (cadr dm) (cadr dmo)) (setq cdmi (+ (* (- (cadr dm) (cadr dmo)) tlv) cdm) ) ) (if (<= (cadr dm) (cadr dmo)) (setq cdmi (- cdm (* (- (cadr dmo) (cadr dm)) tlv) ) ) ) (if (= cdmi 0) (setq cdi (strcat "%%p" (rtos cdmi 2 3)))) (if (> cdmi 0) (setq cdi (strcat "+" (rtos cdmi 2 3)))) (if (< cdmi 0) (setq cdi (rtos cdmi 2 3))) (command "copy" bl "" "_non" (cdr(assoc 10 blm)) "_non" dm) (if (and (wcmatch (cdr(assoc 0 (entget (entlast)))) "INSERT") (= (cdr(assoc 66 (entget (entlast)))) 1)) (setq el (entget (entnext (entlast)) ))) (if (wcmatch (cdr(assoc 0 (entget (entlast)))) "TEXT") (setq el (entget (entlast))) ) (entmod (subst (cons 1 cdi) (assoc 1 el) el)) (setq dmoc dm) ) (setvar "Dimzin" oldim) )) (princ) ) 

    Có thể sử dụng với Text

    E tìm mãi ko ra. Không biết dòng nào của bác Tuenv làm cho blog insert ra có giá trị đều giống blog mẫu mà không nhận cao độ. Hic... Còn phần mở rộng thêm cho text thì oki rùi.


  11. lisp dc của ketxu mình cũng sưu tầm nó lâu rùi. Lisp đó rất chuẩn. Nhưng công việc mình đang cần theo dạng của bác Tuenv như trên, lựa chọn vị trí điểm mốc, chọn cao độ mốc là text trên bản vẽ (hoặc nhập tay vào) ==> chọn vị trí điểm mới và chèn blog cao độ vào đó. (mà không cần chèn blog cao độ vào điểm mốc)


  12. Cám ơn anh giabach.

    Em đang viết và cố gắng hoàn thành xong code này để giúp cho bạn auduongphuc.

    Có gì trở ngại mong anh gia bách và mọi người hỗ trợ thêm.

    Chào anh. Chúc anh thật nhiều sức khoẻ.

    -----------

    Tue_NV đã hoàn thành xong code này

    Bạn auduongphuc chạy thử xem :

    Chỉ Có 2 yêu cầu nhỏ khi chạy code :

    1. Lisp chấp nhận bất cứ Block cao độ nào miễn là Block đó có 1 Atrtibute và Block đó phải có trên CAD để mà ta Pick chon Block mau

    2. Điểm chèn Block đó nên nằm ngay cos cao độ chèn

    Mong bạn auduongphuc hiểu

    (defun c:dcd(/ tlv blm blname dmo cdm cd dm cdmi dmoc)(setvar "attreq" 1)(setvar "cmdecho" 0)(setq oldim (getvar "DimZin"))(setvar "Dimzin" 0)(setq tlv (/ 1 (getreal "\n Nhap ti le ve : 1/")))(setq blm (entget(car(entsel "\n Pick chon Block mau :"))))(setq blname (cdr(assoc 2 blm)))(setq TLX (cdr(assoc 41 blm)))(setq TLY (cdr(assoc 42 blm)))(setq dmo (getpoint "\n Pick diem moc : "))(setq cdm (getreal "\n Nhap cao do cua diem moc :"))(if (= cdm 0) (setq cd (strcat "%%p" (rtos cdm 2 3))))(if (> cdm 0) (setq cd (strcat "+" (rtos cdm 2 3))))(if (< cdm 0) (setq cd (rtos cdm 2 3)))(command "insert" blname dmo TLX TLY "0" cd)(setq dmoc dmo)(while (setq dm (getpoint dmoc "\n Pick diem tiep theo :"))(setq cdmi (* (- (cadr dm) cdm (cadr dmo)) tlv))(if (= cdmi 0) (setq cdi (strcat "%%p" (rtos cdmi 2 3))))(if (> cdmi 0) (setq cdi (strcat "+" (rtos cdmi 2 3))))(if (< cdmi 0) (setq cdi (rtos cdmi 2 3)))(command "insert" blname dm TLX TLY "0" cdi)(setq dmoc dm))(setvar "Dimzin" oldim)(princ))

    Lisp này của bác rất tuyệt. Mong bác chỉnh sửa thêm cho lisp hoàn thiện:

    - Lỗi gặp phải là cao độ điểm mốc khác 0 thì lisp tính phần cao độ tại các điểm thấp hơn chưa đúng. (Thay vì trừ đi khoảng cách giữa 2 điểm thì nó lại lấy cao độ mốc cộng thêm vào và điền dấu trừ phía trước, mặc dù cao độ mốc là 5.00 và khoảng cách giảm xuống là 2.00: Kết quả đúng phải là +3.00 nhưng lisp tính là: -7.00)

    - Khi lựa chọn cao độ mốc, thêm chức năng chọn text trực tiếp trên bản vẽ (Hiện tại chỉ có 1 lựa chọn nhập số bằng tay)

    Thanks


  13. E đang dùng lisp này để trừ 1 text có sẵn cho 1 số được nhập vào bằng tay. Kết quả được ed vào 1 text có trước.

    Mong các bác chỉnh sửa thêm chức năng cho lisp ở thao tác: chọn số trừ

    - Có thể chọn số trừ là khoảng cách d giữa 2 điểm A-B trên cad bằng cách pick vào lần lượt 2 điểm đó. Lisp sẽ tự động xác định khoảng cách d và chọn d làm số trừ.

    Kết hợp cả 2 hình thức lựa chọn số bị trừ là d và nhập số bằng tay sẽ hoàn thiện lisp hơn và làm được nhiều việc hơn.

    Mong được các bác giúp đỡ. Thanks

    ;; free lisp from cadviet.com
    ;;; this lisp was downloaded from http://www.cadviet.com/forum/index.php?showtopic=4077&pid=192557&st=0entry192557
    
    (defun c:ths (/ Ename Elist Msg Oldtext Oldlist Newtext Newlist)
    (command "undo" "be")
    (setq donvi (/ (getvar "viewsize") 40))
    (setq ddd (entsel "\nChon text bi tru"))
    (while
    (or
      (null ddd)
      (/= "TEXT" (cdr (assoc 0 (entget (car ddd)))))
    )
    (princ "\nDoi tuong khong phai la text! Chon lai")
    (setq ddd (entsel "\nChon text bi tru"))
    )
     (setq DTDTT (car ddd))
     (setq DTTT (entget DTDTT))
     (setq NDTTT (cdr (assoc 1 DTTT)))
     (setq NDTTT (atof NDTTT))
     (setq DIEMVIETTEXT (cdr (assoc 10 DTTT)))
    (setq diemvt1 (polar DIEMVIETTEXT pi donvi))
    (setq diemvt2 (polar DIEMVIETTEXT (* 2 pi) donvi))
    (setq diemvt3 (polar DIEMVIETTEXT (/ pi 2) donvi))
    (setq diemvt4 (polar DIEMVIETTEXT (- 0 (/ pi 2)) donvi))
    		(grdraw diemvt1 diemvt2 3)
    		(grdraw diemvt3 diemvt4 3)
    (if (= droffln nil)
    (setq droffln1 2.00)
    (setq droffln1 droffln)
    )
    (setq
    droffln (GETREAL (strcat "\nNhap hang so tru: <" (rtos droffln1 2 2) ">"))
    )
    (if (= droffln nil)
    (setq droffln droffln1)
    )
    (setq ketquaxuat (- NDTTT droffln))
    (setq ketquaxuat (rtos ketquaxuat 2 2))
    (setq dddsn (entsel "\nChon text xuat ket qua"))
    (while
    (or
      (null dddsn)
      (/= "TEXT" (cdr (assoc 0 (entget (car dddsn)))))
    )
    (princ "\nDoi tuong khong phai la text! Chon lai")
    (setq dddsn (entsel "\nChon text tru"))
    )
       	(setq DTDTTsn (car dddsn))
       	(setq DTMs (entget DTDTTsn))
       	(setq DTMs (subst (cons 1 ketquaxuat) (assoc 1 DTMs) DTMs))
       	(entmod DTMs)
    (command "undo" "end")
      (Princ))
    
    


  14. - Bao gồm các phép tính đơn giản mà mình hay dùng :

    Plus - cộng các số, Subtract - trừ 1 số với nhiều số, Multiply - nhân các số, Divide - chia một số với nhiều số, Average - tính trung bình, Max-min - số lớn nhất, nhỏ nhất trong các tập hợp chọn, Add by - cộng các số với một số cho trước, Multiply by - nhân các số với một số cho trước, Precision - độ chính xác của kết quả.

    - Tùy chọn xuất kết quả: ghi đè lên 1 Text, tạo Text mới hoặc chỉ xem.

    - Xuất biểu thức để kiểm tra, hỗ trợ vòng lặp cho 1 phép tính.

    ;;----------------------------------------------;;
    ;;	Text calculation tool -  Skywings	;;
    ;;----------------------------------------------;;
    
    ;;***SUB-FUNCTION***
    (defun GET-TEXT	()
     (princ "\nSelect NUMBERs : ")
     (while (null (setq Numbers (ssget '((0 . "*TEXT")))))
       (princ "\n**NOTHING selected!**")
     )
    )
    (defun GET-DATA (/ ss-mt ss-t n)
     (setq	ss-mt (ssadd)
    ss-t  (ssadd)
    n 	0
    sw    0
     )
     (repeat (sslength Numbers)
       (setq ent (ssname Numbers n))
       (if	(= (cdr (assoc 0 (entget ent))) "MTEXT")
         (setq ss-mt (ssadd ent ss-mt))
         (setq ss-t (ssadd ent ss-t))
       )
       (setq n (1+ n))
     )  
     (if (/= (sslength ss-mt) 0)
       (setq Numbers (acet-explode ss-mt)
     	sw  	1
       )
     )
     (setq n 0)
     (repeat (sslength ss-t)
       (setq ent  	(ssname ss-t n)
     	Numbers (ssadd ent Numbers)
     	n  	(1+ n)
       )
     )
    )
    (defun GET-VALUE (name / sw)
     (princ (strcat "\nSelect " name " : "))
     (cond
       ((= (cdr (assoc 0 (entget ename))) "MTEXT")
    (command ".explode" ename "")
    (setq value (read (cdr (assoc 1 (entget (entlast)))))
      	sw 	1
    )
       )
       ((setq value (read (cdr (assoc 1 (entget ent))))))
     )
     (if (= sw 1)
       (command ".undo" 1)
     )
     value
    )
    (defun OPT ()
     (if (null option)
       (setq option "Replace"
     	save2 	option
       )
     )
     (initget "Replace Create Do-nothing")
     (setq
       option
    (getkword
      	(strcat "\nOptions: [Replace/Create/Do-nothing] <"
          	option
          	"> "
      	)
    )
     )
     (if (null option)
       (setq option save2)
       (setq save2 option)
     )
     (setq switch 1)
    )
    (defun ACTION (option result / txt pnt)
     (cond
       ((= option "Replace")
    (while (null (setq txt (entsel "\nChoose TEXT to replace: ")))
      	(princ "\n**NOTHING selected!**")
    )
    (setq txt (entget (car txt))
      	txt (subst (cons 1 result) (assoc 1 txt) txt)
    )
    (entmod txt)
       )
       ((= option "Create")
    (setq pnt (getpoint "\nSpecify start point of text:"))
    (entmake (list (assoc 0 ent)
       		(assoc 8 ent)
       		(cons 1 result)
       		(cons 10 (trans pnt 1 0))
       		(assoc 40 ent)
       		(assoc 7 ent)
       		(assoc 50 ent)
         	)
    )
       )
     )
    )
    (defun GET-ORDER ()
     (princ (strcat "\nCurrent setting: Precision = "
            (rtos precision 2 0)
            " <"
            (rtos 0 2 precision)
            ">"
    	)
     )
     (initget
       "Plus Subtract Multiply Divide Average maX-min ADd-by mUltiply-by preCision"
     )
     (setq	operation
    	(getkword
      	(strcat
        	"\nOperations: [Plus/Subtract/Multiply/Divide/Average/maX-min/ADd-by/mUltiply-by/preCision]: <"
        	operation
        	"> "
      	)
    	)
     )
     (if (null operation)
       (setq operation save1)
       (setq save1 operation)
     )
    )
    ;;***MAIN FUNCTION***:
    (defun c:TCAL (/ Numbers   DIVIDEND  DIVISOR   ENT 	ID
            INDEX   	MINUEND   NUM-MAX   NUM-MIN 	NUM-SET
            RESULT   	SUBTRAHEND       	SWITCH 	VALUE
            sw
    	)
     (princ
       "** Text calculation tool - Skywings **"
     )
     (setvar "CMDECHO" 0)
     (setvar "QAFLAGS" 1)
     (if (null precision)
       (setq precision 2
     	save3	precision
       )
     )
     (if (null operation)
       (setq operation "Plus"
     	save1	operation
       )
     )
     (GET-ORDER)
     (while (= operation "preCision")
       (initget 4)
       (setq
         precision	(getint	(strcat	"\nSpecify new precision: <"
    			(rtos precision 2 0)
    			"> "
    		)
    	)
       )
       (if	(null precision)
         (setq precision save3)
         (setq save3 precision)
       )
       (GET-ORDER)
     )
     (cond
       ;; PLUS:
       ((= operation "Plus")
    (GET-TEXT)
    (setq switch 0)
    (while (/= Numbers nil)
      	(GET-DATA)
      	(setq index 0
        	result 0
      	)
      	(princ "\n>>Expression: ")
      	(repeat (sslength Numbers)
    	(setq ent   (entget (ssname Numbers index))
          	value (read (cdr (assoc 1 ent)))
          	index (1+ index)
    	)
    	(if (numberp value)
      	(progn
        	(setq result (+ result value))
        	(if (/= index 1)
          	(princ " + ")
        	)
        	(princ (rtos value 2 precision))
      	)
    	)
      	)
      	(if (= sw 1) (command ".undo" 1))
      	(princ (strcat "\n>>RESULT = " (rtos result 2 precision)))
      	(if (= switch 0)
    	(OPT)
      	)
      	(ACTION option (rtos result 2 precision))
      	(setq Numbers nil
        	Numbers (ssget '((0 . "*TEXT")))
      	)
    )
       )
       ;; MULTIPLY:
       ((= operation "Multiply")
         (GET-TEXT)
         (setq switch 0)
         (while (/= Numbers nil)
    (GET-DATA)
    (setq index 0
         	result 1
    )
    (princ "\n>>Expression: ")
    (repeat	(sslength Numbers)
     	(setq	ent   (entget (ssname Numbers index))
    	value (read (cdr (assoc 1 ent)))
    	index (1+ index)
     	)
     	(if (numberp value)
       	(progn
         	(setq result (* result value))
         	(if (/= index 1)
    	(princ " * ")
         	)
         	(princ (rtos value 2 precision))
       	)
     	)
    )
    (if (= sw 1)
     	(command ".undo" 1)
    )
    (princ (strcat "\n>>RESULT = " (rtos result 2 precision)))
    (if (= switch 0)
     	(OPT)
    )
    (ACTION option (rtos result 2 precision))
    (setq Numbers nil
         	Numbers (ssget '((0 . "*TEXT")))
    )
         )
       )
       ;; SUBTRACT:
       ((= operation "Subtract")
         (setq switch 0
       	sw 0
         )
         (while (null (setq ename (car (entsel (strcat "\nSelect MINUEND : "))))))
         (setq minuend (GET-VALUE "MINUEND"))
         (while (null (numberp minuend))
    (while (null (setq ename (car (entsel (strcat "\nSelect MINUEND : "))))))
    (setq minuend (GET-VALUE "MINUEND"))
         )
         (princ minuend)
         (redraw ename 3)
         (princ "\nSelect SUBTRAHENDs : ")
         (while (null (setq Numbers (ssget '((0 . "*TEXT")))))
    (princ "\nSelect SUBTRAHENDs : ")
         )
         (redraw ename 4)
         (while (/= ename nil)
    (GET-DATA)
    (setq index   0
         	result  0
         	minuend (float minuend)
    )
    (princ (strcat "\n>>Expression: "
                  (rtos minuend 2 precision)
                  " - ("
          	)
    )
    (repeat	(sslength Numbers)
     	(setq	ent   	(entget (ssname Numbers index))
    	subtrahend (read (cdr (assoc 1 ent)))
    	index   	(1+ index)
     	)
     	(if (numberp subtrahend)
       	(progn
         	(setq result (+ result subtrahend))
         	(if (/= index 1)
    	(princ " + ")
         	)
         	(princ (rtos subtrahend 2 precision))
       	)
     	)
    )
    (princ ")")
    (if (= sw 1)
     	(command ".undo" 1)
    )
    (setq result (- minuend result))
    (princ (strcat "\n>>RESULT = " (rtos result 2 precision)))
    (if (= switch 0)
     	(OPT)
    )
    (ACTION option (rtos result 2 precision))
    (setq ename nil
         	ename (car (entsel (strcat "\nSelect MINUEND : ")))
    )
    (if
     	(or
       	(null ename)
       	(null (numberp (setq minuend (GET-VALUE "MINUEND"))))
     	)
     	(progn
       	(setvar "QAFLAGS" 0)
       	(vl-exit-with-error "")
     	)
    )
    (princ minuend)
    (princ "\nSelect SUBTRAHENDs <TEXT>: ")
    (while (null (setq Numbers (ssget '((0 . "*TEXT")))))
     	(princ "\nSelect SUBTRAHENDs : ")
    )
         )
       )
       ;; DIVIDE:
       ((= operation "Divide")
         (setq switch 0
       	sw 0
         )
         (while (null (setq ename (car (entsel (strcat "\nSelect DIVIDEND : "))))))
         (setq dividend (GET-VALUE "DIVIDEND"))
         (while (null (numberp dividend))
    (while (null (setq ename (car (entsel (strcat "\nSelect DIVIDEND : "))))))
    (setq dividend (GET-VALUE "DIVIDEND"))
         )
         (princ dividend)
         (redraw ename 3)
         (princ "\nSelect DIVISORs : ")
         (while (null (setq Numbers (ssget '((0 . "*TEXT")))))
    (princ "\nSelect DIVISORs : ")
         )
         (redraw ename 4)
         (while (/= ename nil)
    (GET-DATA)
    (setq index   0
         	result  1
         	dividend (float dividend)
    )
    (princ (strcat "\n>>Expression: "
                  (rtos dividend 2 precision)
                  " / ("
          	)
    )
    (repeat	(sslength Numbers)
     	(setq	ent	(entget (ssname Numbers index))
    	divisor	(read (cdr (assoc 1 ent)))
    	index	(1+ index)
     	)
     	(if (numberp divisor)
       	(progn
         	(setq result (* result divisor))
         	(if (/= index 1)
    	(princ " * ")
         	)
         	(princ (rtos divisor 2 precision))
       	)
     	)
    )
    (princ ")")
    (if (= sw 1)
     	(command ".undo" 1)
    )
    (setq result (/ dividend result))
    (princ (strcat "\n>>RESULT = " (rtos result 2 precision)))
    (if (= switch 0)
     	(OPT)
    )
    (ACTION option (rtos result 2 precision))
    (setq ename nil
         	ename (car (entsel (strcat "\nSelect DIVIDEND : ")))
    )
    (if
     	(or
       	(null ename)
       	(null (numberp (setq dividend (GET-VALUE "DIVIDEND"))))
     	)
     	(progn
       	(setvar "QAFLAGS" 0)
       	(vl-exit-with-error "")
     	)
    )
    (princ dividend)
    (princ "\nSelect DIVISORs : ")
    (while (null (setq Numbers (ssget '((0 . "*TEXT")))))
     	(princ "\nSelect DIVISORs : ")
    )
         )
       )
       ;; AVERAGE:
       ((= operation "Average")
    (GET-TEXT)
    (setq switch 0)
    (while (/= Numbers nil)
      	(GET-DATA)
      	(setq index 0
        	id	0
        	result 0
      	)
      	(princ "\n>>Expression: (")
      	(repeat (sslength Numbers)
    	(setq ent   (entget (ssname Numbers index))
          	value (read (cdr (assoc 1 ent)))
          	index (1+ index)
    	)
    	(if (numberp value)
      	(progn
        	(setq result (+ result value)
              id  	(1+ id)
        	)
        	(if (/= index 1)
          	(princ " + ")
        	)
        	(princ (rtos value 2 precision))
      	)
    	)
      	)
      	(if (= sw 1) (command ".undo" 1))
      	(setq result (rtos (/ (float result) id) 2 precision))
      	(princ (strcat ") / " (rtos id 2 0)))
      	(princ (strcat "\n>>RESULT = " result))
      	(if (= switch 0)
    	(OPT)
      	)
      	(ACTION option result)
      	(setq Numbers nil
        	Numbers (ssget '((0 . "*TEXT")))
      	)
    )
       )
       ;; MAX-MIN:
       ((= operation "maX-min")
    (GET-TEXT)
    (setq switch 0)
    (while (/= Numbers nil)
      	(GET-DATA)
      	(setq index 0
        	Num-set nil
      	)
      	(repeat (sslength Numbers)
    	(setq ent   (entget (ssname Numbers index))
          	value (read (cdr (assoc 1 ent)))
          	index (1+ index)
    	)
    	(if (numberp value)
      	(setq Num-set (cons value Num-set))
    	)
      	)
      	(setq Num-set (vl-sort Num-set '>)
        	num-max (car Num-set)
        	num-min (last Num-set)
        	result  (strcat "MAX = "
                 (rtos num-max 2 precision)
                 "  MIN = "
                 (rtos num-min 2 precision)
                )
      	)
      	(if (= sw 1) (command ".undo" 1))
      	(princ "\n>>Numbers set: ")
      	(princ Num-set)
      	(print)
      	(princ result)
      	(if (= switch 0)
    	(OPT)
      	)
      	(ACTION option result)
      	(setq Numbers nil
        	Numbers (ssget '((0 . "*TEXT")))
      	)
    )
       )
       ;; ADD-BY...:
       ((= operation "ADd-by")
    (if (null number0)
      	(setq number0 0.00
        	save4 number0
      	)
    )
    (setq number0 (getreal (strcat "Add by: <" (rtos number0 2 2) "> "))
      	index   0
    )
    (if (null number0)
      	(setq number0 save4)
      	(setq save4 number0)
    )
    (GET-TEXT)
    (GET-DATA)
    (repeat (sslength Numbers)      
      	(setq ent   (entget (ssname Numbers index))
        	value (read (cdr (assoc 1 ent)))
        	index (1+ index)
      	)      
      	(if (numberp value)
    	(setq value (+ (float value) number0)
          	ent   (subst (cons 1 (rtos value 2 precision))
        		(assoc 1 ent)
        		ent
                )
    	)
      	)
      	(entmod ent)      
    )
       )
       ;;MULTIPLY-BY...:
       ((= operation "mUltiply-by")
    (if (null number0)
      	(setq number0 0.00
        	save4 number0
      	)
    )
    (setq number0 (getreal (strcat "Multiply by: <" (rtos number0 2 2) "> "))
      	index   0
    )
    (if (null number0)
      	(setq number0 save4)
      	(setq save4 number0)
    )
    (GET-TEXT)
    (GET-DATA)
    (repeat (sslength Numbers)
      	(setq ent   (entget (ssname Numbers index))
        	value (read (cdr (assoc 1 ent)))
        	index (1+ index)
      	)
      	(if (numberp value)
    	(setq value (* (float value) number0)
          	ent   (subst (cons 1 (rtos value 2 precision))
        		(assoc 1 ent)
        		ent
                )
    	)
      	)
      	(entmod ent)
    )
       )
     )
     (princ "<Exit>")
     (setvar "QAFLAGS" 0)
     (princ)
    )
    

    E không hiểu tự nhiên bây giờ mang ra dùng lisp này, đối tượng là text, khi dùng TCAL để trừ và chia thì đều báo lỗi:

    Command: TCAL

    ** Text calculation tool - Skywings **

    Current setting: Precision = 2 <0.00>

    Operations:

    [Plus/Subtract/Multiply/Divide/Average/maX-min/ADd-by/mUltiply-by/preCision]:

    <Subtract> S

     

    Select MINUEND :

    Select MINUEND : ; error: bad argument type: lentityp nil

     

    Select DIVIDEND :

    Select DIVIDEND : ; error: bad argument type: lentityp nil


  15. Thêm 1 chú nữa:

    ;; free lisp from cadviet.com
    ;;; this lisp was downloaded from http://www.cadviet.com/forum/index.php?showtopic=37567
    ;;----------------------------------------------;;
    ;; Text calculation tool -  Skywings ;;
    ;;----------------------------------------------;;
    ;;***SUB-FUNCTION***
    (defun GET-TEXT ()
     (princ "\nSelect NUMBERs : ")
     (while (null (setq Numbers (ssget '((0 . "*TEXT")))))
    (princ "\n**NOTHING selected!**")
     )
    )
    (defun GET-DATA (/ ss-mt ss-t n)
     (setq ss-mt (ssadd)
    ss-t  (ssadd)
    n 	0
    sw	0
     )
     (repeat (sslength Numbers)
    (setq ent (ssname Numbers n))
    (if (= (cdr (assoc 0 (entget ent))) "MTEXT")
     	(setq ss-mt (ssadd ent ss-mt))
     	(setq ss-t (ssadd ent ss-t))
    )
    (setq n (1+ n))
     ) 
     (if (/= (sslength ss-mt) 0)
    (setq Numbers (acet-explode ss-mt)
      sw   1
    )
     )
     (setq n 0)
     (repeat (sslength ss-t)
    (setq ent   (ssname ss-t n)
      Numbers (ssadd ent Numbers)
      n   (1+ n)
    )
     )
    )
    (defun GET-VALUE (name / sw)
     (princ (strcat "\nSelect " name " : "))
     (cond
    ((= (cdr (assoc 0 (entget ename))) "MTEXT")
    	(command ".explode" ename "")
    	(setq value (read (cdr (assoc 1 (entget (entlast)))))
    sw  1
    	)
    )
    ((setq value (read (cdr (assoc 1 (entget ent))))))
     )
     (if (= sw 1)
    (command ".undo" 1)
     )
     value
    )
    (defun OPT ()
     (if (null option)
    (setq option "Replace"
      save2  option
    )
     )
     (initget "Replace Create Do-nothing")
     (setq
    option
    	(getkword
      	(strcat "\nOptions: [Replace/Create/Do-nothing] <"
       	option
       	"> "
      	)
    	)
     )
     (if (null option)
    (setq option save2)
    (setq save2 option)
     )
     (setq switch 1)
    )
    (defun ACTION (option result / txt pnt)
     (cond
    ((= option "Replace")
    	(while (null (setq txt (entsel "\nChoose TEXT to replace: ")))
      	(princ "\n**NOTHING selected!**")
    	)
    	(setq txt (entget (car txt))
    txt (subst (cons 1 result) (assoc 1 txt) txt)
    	)
    	(entmod txt)
    )
    ((= option "Create")
    	(setq pnt (getpoint "\nSpecify start point of text:"))
    	(entmake (list (assoc 0 ent)
     	(assoc 8 ent)
     	(cons 1 result)
     	(cons 10 (trans pnt 1 0))
     	(assoc 40 ent)
     	(assoc 7 ent)
     	(assoc 50 ent)
      	)
    	)
    )
     )
    )
    (defun GET-ORDER ()
     (princ (strcat "\nCurrent setting: Precision = "
      (rtos precision 2 0)
      " <"
      (rtos 0 2 precision)
      ">"
     )
     )
     (initget
    "Plus Subtract Multiply Divide Average maX-min ADd-by mUltiply-by preCision"
     )
     (setq operation
     (getkword
    (strcat
     	"\nOperations: [Plus/Subtract/Multiply/Divide/Average/maX-min/ADd-by/mUltiply-by/preCision]: <"
     	operation
     	"> "
    )
     )
     )
     (if (null operation)
    (setq operation save1)
    (setq save1 operation)
     )
    )
    ;;***MAIN FUNCTION***:
    (defun c:TCAL (/ Numbers   DIVIDEND  DIVISOR   ENT  ID
      INDEX	MINUEND   NUM-MAX   NUM-MIN  NUM-SET
      RESULT	SUBTRAHEND    	SWITCH  VALUE
      sw
     )
     (princ
    "** Text calculation tool - Skywings **"
     )
     (setvar "CMDECHO" 0)
     (setvar "QAFLAGS" 1)
     (if (null precision)
    (setq precision 2
      save3 precision
    )
     )
     (if (null operation)
    (setq operation "Plus"
      save1 operation
    )
     )
     (GET-ORDER)
     (while (= operation "preCision")
    (initget 4)
    (setq
     	precision (getint (strcat "\nSpecify new precision: <"
    (rtos precision 2 0)
    "> "
      )
     )
    )
    (if (null precision)
     	(setq precision save3)
     	(setq save3 precision)
    )
    (GET-ORDER)
     )
     (cond
    ;; PLUS:
    ((= operation "Plus")
    	(GET-TEXT)
    	(setq switch 0)
    	(while (/= Numbers nil)
      	(GET-DATA)
      	(setq index 0
     	result 0
      	)
      	(princ "\n>>Expression: ")
      	(repeat (sslength Numbers)
     (setq ent   (entget (ssname Numbers index))
       	value (read (cdr (assoc 1 ent)))
       	index (1+ index)
     )
     (if (numberp value)
    (progn
     	(setq result (+ result value))
     	(if (/= index 1)
       	(princ " + ")
     	)
     	(princ (rtos value 2 precision))
    )
     )
      	)
      	(if (= sw 1) (command ".undo" 1))
      	(princ (strcat "\n>>RESULT = " (rtos result 2 precision)))
      	(if (= switch 0)
     (OPT)
      	)
      	(ACTION option (rtos result 2 precision))
      	(setq Numbers nil
     	Numbers (ssget '((0 . "*TEXT")))
      	)
    	)
    )
    ;; MULTIPLY:
    ((= operation "Multiply")
     	(GET-TEXT)
     	(setq switch 0)
     	(while (/= Numbers nil)
    (GET-DATA)
    (setq index 0
      	result 1
    )
    (princ "\n>>Expression: ")
    (repeat (sslength Numbers)
      (setq ent   (entget (ssname Numbers index))
     value (read (cdr (assoc 1 ent)))
     index (1+ index)
      )
      (if (numberp value)
    	(progn
      	(setq result (* result value))
      	(if (/= index 1)
     (princ " * ")
      	)
      	(princ (rtos value 2 precision))
    	)
      )
    )
    (if (= sw 1)
      (command ".undo" 1)
    )
    (princ (strcat "\n>>RESULT = " (rtos result 2 precision)))
    (if (= switch 0)
      (OPT)
    )
    (ACTION option (rtos result 2 precision))
    (setq Numbers nil
      	Numbers (ssget '((0 . "*TEXT")))
    )
     	)
    )
    ;; SUBTRACT:
    ((= operation "Subtract")
     	(setq switch 0
    	sw 0
     	)
     	(while (null (setq ename (car (entsel (strcat "\nSelect MINUEND : "))))))
     	(setq minuend (GET-VALUE "MINUEND"))
     	(while (null (numberp minuend))
    (while (null (setq ename (car (entsel (strcat "\nSelect MINUEND : "))))))
    (setq minuend (GET-VALUE "MINUEND"))
     	)
     	(princ minuend)
     	(redraw ename 3)
     	(princ "\nSelect SUBTRAHENDs : ")
     	(while (null (setq Numbers (ssget '((0 . "*TEXT")))))
    (princ "\nSelect SUBTRAHENDs : ")
     	)
     	(redraw ename 4)
     	(while (/= ename nil)
    (GET-DATA)
    (setq index   0
      	result  0
      	minuend (float minuend)
    )
    (princ (strcat "\n>>Expression: "
        	(rtos minuend 2 precision)
        	" - ("
       	)
    )
    (repeat (sslength Numbers)
      (setq ent	(entget (ssname Numbers index))
     subtrahend (read (cdr (assoc 1 ent)))
     index	(1+ index)
      )
      (if (numberp subtrahend)
    	(progn
      	(setq result (+ result subtrahend))
      	(if (/= index 1)
     (princ " + ")
      	)
      	(princ (rtos subtrahend 2 precision))
    	)
      )
    )
    (princ ")")
    (if (= sw 1)
      (command ".undo" 1)
    )
    (setq result (- minuend result))
    (princ (strcat "\n>>RESULT = " (rtos result 2 precision)))
    (if (= switch 0)
      (OPT)
    )
    (ACTION option (rtos result 2 precision))
    (setq ename nil
      	ename (car (entsel (strcat "\nSelect MINUEND : ")))
    )
    (if
      (or
    	(null ename)
    	(null (numberp (setq minuend (GET-VALUE "MINUEND"))))
      )
      (progn
    	(setvar "QAFLAGS" 0)
    	(vl-exit-with-error "")
      )
    )
    (princ minuend)
    (princ "\nSelect SUBTRAHENDs <TEXT>: ")
    (while (null (setq Numbers (ssget '((0 . "*TEXT")))))
      (princ "\nSelect SUBTRAHENDs : ")
    )
     	)
    )
    ;; DIVIDE:
    ((= operation "Divide")
     	(setq switch 0
    	sw 0
     	)
     	(while (null (setq ename (car (entsel (strcat "\nSelect DIVIDEND : "))))))
     	(setq dividend (GET-VALUE "DIVIDEND"))
     	(while (null (numberp dividend))
    (while (null (setq ename (car (entsel (strcat "\nSelect DIVIDEND : "))))))
    (setq dividend (GET-VALUE "DIVIDEND"))
     	)
     	(princ dividend)
     	(redraw ename 3)
     	(princ "\nSelect DIVISORs : ")
     	(while (null (setq Numbers (ssget '((0 . "*TEXT")))))
    (princ "\nSelect DIVISORs : ")
     	)
     	(redraw ename 4)
     	(while (/= ename nil)
    (GET-DATA)
    (setq index   0
      	result  1
      	dividend (float dividend)
    )
    (princ (strcat "\n>>Expression: "
        	(rtos dividend 2 precision)
        	" / ("
       	)
    )
    (repeat (sslength Numbers)
      (setq ent (entget (ssname Numbers index))
     divisor (read (cdr (assoc 1 ent)))
     index (1+ index)
      )
      (if (numberp divisor)
    	(progn
      	(setq result (* result divisor))
      	(if (/= index 1)
     (princ " * ")
      	)
      	(princ (rtos divisor 2 precision))
    	)
      )
    )
    (princ ")")
    (if (= sw 1)
      (command ".undo" 1)
    )
    (setq result (/ dividend result))
    (princ (strcat "\n>>RESULT = " (rtos result 2 precision)))
    (if (= switch 0)
      (OPT)
    )
    (ACTION option (rtos result 2 precision))
    (setq ename nil
      	ename (car (entsel (strcat "\nSelect DIVIDEND : ")))
    )
    (if
      (or
    	(null ename)
    	(null (numberp (setq dividend (GET-VALUE "DIVIDEND"))))
      )
      (progn
    	(setvar "QAFLAGS" 0)
    	(vl-exit-with-error "")
      )
    )
    (princ dividend)
    (princ "\nSelect DIVISORs : ")
    (while (null (setq Numbers (ssget '((0 . "*TEXT")))))
      (princ "\nSelect DIVISORs : ")
    )
     	)
    )
    ;; AVERAGE:
    ((= operation "Average")
    	(GET-TEXT)
    	(setq switch 0)
    	(while (/= Numbers nil)
      	(GET-DATA)
      	(setq index 0
     	id 0
     	result 0
      	)
      	(princ "\n>>Expression: (")
      	(repeat (sslength Numbers)
     (setq ent   (entget (ssname Numbers index))
       	value (read (cdr (assoc 1 ent)))
       	index (1+ index)
     )
     (if (numberp value)
    (progn
     	(setq result (+ result value)
    	id   (1+ id)
     	)
     	(if (/= index 1)
       	(princ " + ")
     	)
     	(princ (rtos value 2 precision))
    )
     )
      	)
      	(if (= sw 1) (command ".undo" 1))
      	(setq result (rtos (/ (float result) id) 2 precision))
      	(princ (strcat ") / " (rtos id 2 0)))
      	(princ (strcat "\n>>RESULT = " result))
      	(if (= switch 0)
     (OPT)
      	)
      	(ACTION option result)
      	(setq Numbers nil
     	Numbers (ssget '((0 . "*TEXT")))
      	)
    	)
    )
    ;; MAX-MIN:
    ((= operation "maX-min")
    	(GET-TEXT)
    	(setq switch 0)
    	(while (/= Numbers nil)
      	(GET-DATA)
      	(setq index 0
     	Num-set nil
      	)
      	(repeat (sslength Numbers)
     (setq ent   (entget (ssname Numbers index))
       	value (read (cdr (assoc 1 ent)))
       	index (1+ index)
     )
     (if (numberp value)
    (setq Num-set (cons value Num-set))
     )
      	)
      	(setq Num-set (vl-sort Num-set '>)
     	num-max (car Num-set)
     	num-min (last Num-set)
     	result  (strcat "MAX = "
       	(rtos num-max 2 precision)
       	"  MIN = "
       	(rtos num-min 2 precision)
      	)
      	)
      	(if (= sw 1) (command ".undo" 1))
      	(princ "\n>>Numbers set: ")
      	(princ Num-set)
      	(print)
      	(princ result)
      	(if (= switch 0)
     (OPT)
      	)
      	(ACTION option result)
      	(setq Numbers nil
     	Numbers (ssget '((0 . "*TEXT")))
      	)
    	)
    )
    ;; ADD-BY...:
    ((= operation "ADd-by")
    	(if (null number0)
      	(setq number0 0.00
     	save4 number0
      	)
    	)
    	(setq number0 (getreal (strcat "Add by: <" (rtos number0 2 2) "> "))
    index   0
    	)
    	(if (null number0)
      	(setq number0 save4)
      	(setq save4 number0)
    	)
    	(GET-TEXT)
    	(GET-DATA)
    	(repeat (sslength Numbers)      
      	(setq ent   (entget (ssname Numbers index))
     	value (read (cdr (assoc 1 ent)))
     	index (1+ index)
      	)      
      	(if (numberp value)
     (setq value (+ (float value) number0)
       	ent   (subst (cons 1 (rtos value 2 precision))
      	(assoc 1 ent)
      	ent
      	)
     )
      	)
      	(entmod ent)      
    	)
    )
    ;;MULTIPLY-BY...:
    ((= operation "mUltiply-by")
    	(if (null number0)
      	(setq number0 0.00
     	save4 number0
      	)
    	)
    	(setq number0 (getreal (strcat "Multiply by: <" (rtos number0 2 2) "> "))
    index   0
    	)
    	(if (null number0)
      	(setq number0 save4)
      	(setq save4 number0)
    	)
    	(GET-TEXT)
    	(GET-DATA)
    	(repeat (sslength Numbers)
      	(setq ent   (entget (ssname Numbers index))
     	value (read (cdr (assoc 1 ent)))
     	index (1+ index)
      	)
      	(if (numberp value)
     (setq value (* (float value) number0)
       	ent   (subst (cons 1 (rtos value 2 precision))
      	(assoc 1 ent)
      	ent
      	)
     )
      	)
      	(entmod ent)
    	)
    )
     )
     (princ "<Exit>")
     (setvar "QAFLAGS" 0)
     (princ)
    )
    
    

    Tcal dùng lựa chọn AD (add-by) nhập hằng số K là -K nếu muốn trừ, K nếu muốn cộng

    • Vote tăng 1

  16. *Tên biến: Pickfirst

    Tác dụng: Điều khiển việc chọn các đối tượng trước khi thực hiện lệnh

    0= vô hiệu

    1= hiệu lực hóa

    Hề hề, e làm theo nhưng hôk được bác ah. Căn bệnh này có vẻ nan y khó chữa roài. :D

    Lỗi này phát sinh khi e mở 1 bản vẽ copy ở nơi khác về. Kể từ đó là bị dính đòn ngay

×