Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
nataca

Lisp các phép tính đại số tự động cập nhật khi giá trị nguồn thay đổi

Các bài được khuyến nghị

nataca    553

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.

  • Vote tăng 19

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Thaistreetz    515
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:

-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ê)

 

Đỡ quá! từ hồi đọc bài của anh Gia Bach em đã có ý định xây dựng code tính toán kiểu này rồi, nhưng kiến thức có hạn, công việc lại bận quá nên chưa có thời gian. Cảm ơn anh Nataca rất nhiều vì đã chia sẻ một lisp hay.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
nataca    553
Bác xem lại hộ em nhé: khi dùng lệnh nó báo lỗi "error: no function definition: START_PG" em dùng cad 2008

Bạn thử Copy lại xem sao. Có thể là do bạn copy thiếu. Hôm nay chức năng upload trên diễn đàn bị lỗi nên mình chưa upload file lên được.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Tue_NV    3.841
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:

;;;------------------------------------------
;;;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
)

Chào Nataca

Phía trên là một đoạn Code của bạn trong chủ đề này.

Nataca cho Tue_NV hỏi một chút về tính năng của hàm grread và các tham số của chúng.

Mình đã đọc trong Help rồi mà chưa hiểu lắm.

(setq mouse (grread 0 15 2))

(= (car mouse) 3) -> có nghĩa là gì?

Nataca giải thích dùm mình tý nhé.

Cảm ơn Nataca

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
hhhhgggg    30
Chào Nataca

Phía trên là một đoạn Code của bạn trong chủ đề này.

Nataca cho Tue_NV hỏi một chút về tính năng của hàm grread và các tham số của chúng.

Mình đã đọc trong Help rồi mà chưa hiểu lắm.

(setq mouse (grread 0 15 2))

(= (car mouse) 3) -> có nghĩa là gì?

Nataca giải thích dùm mình tý nhé.

Cảm ơn Nataca

Xin lỗi các bác Pro, Em copy lisp về đánh lệnh thì ko thấy chạy j cả ? Hay là em ko bit cách sử dụng ?

 

Command: lgt

; error: no function definition: START_PG

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
nataca    553
Chào Nataca

Phía trên là một đoạn Code của bạn trong chủ đề này.

Nataca cho Tue_NV hỏi một chút về tính năng của hàm grread và các tham số của chúng.

Mình đã đọc trong Help rồi mà chưa hiểu lắm.

(setq mouse (grread 0 15 2))

(= (car mouse) 3) -> có nghĩa là gì?

Nataca giải thích dùm mình tý nhé.

Cảm ơn Nataca

Cú pháp của hàm Grread là: (Grread [track] [allkeys [curtype]])

Trong đó:

- Track: là tham số để chuyển con trỏ sang chế độ kéo rê (tức khi di chuột thì hàm số trả về toạ độ điểm mà con trỏ đi qua). Tham số này có thể là Nill (hoặc không có) thì hàm chỉ trả về giá trị khi ta nhấn 1 phím nào đó, nếu tham số này là T (hoặc một số bất kỳ) thì nó sẽ trả về toạ độ của nó khi con chuột đi qua.

- Allkeys: có các giá trị là 1, 2, 4, 8, 16 hoặc tổng của các thành phần đó. 15= 1+2+4+8 tức là trả về toạ độ 3D ở chế độ kéo rê+trả về giá trí của tất cả các phím trên bàn phím nếu nhấn+sử dụng tham số curtype để biểu diễn dạng hình ảnh của con chuột+không hiển thị dòng thông báo lỗi

- Curtype: là hình dạng con trỏ. ở đây giá trị là 2 tức con trỏ có hình ô vuông

 

Giá trị Mouse luôn thay đổi khi con trỏ di chuyển hoặc đánh phím nào trên bàn phím có dạng (K GT)

với : K là kiểu . Ví dụ: nếu rê chuột bình thường không nhấn j hết thì là 5, nhấn từ bàn phím là 2, khi pick chuột thì là 3....

------GT là giá trị trả về tương ứng với kiểu . Nếu K=3 hoặc 5 thì sẽ cho ra toạ độ của con trỏ, khi K=2 thì cho ra mã của các phím...

Ở đây (car mouse) = 3 tức là khi ta pick chuột để chọn 1 vị trí nào đó thì nó sẽ cho ra toạ độ điểm pick chuột.

(/= (car mouse) 2) tức là khi nào chưa nhấn 1 phím nào trên bàn phím thì vẫn ở trong vòng lặp, chỉ thoát khỏi vòng lặp khi nhấn 1 phím nào từ bàn phím.

  • Vote tăng 3

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
nataca    553
Xin lỗi các bác Pro, Em copy lisp về đánh lệnh thì ko thấy chạy j cả ? Hay là em ko bit cách sử dụng ?

 

Command: lgt

; error: no function definition: START_PG

Mình cũng không hiểu sao lại bị lỗi thế. Bạn thử dùng file biên dịch này xem sao: tính toán với link

 

Mò 1 lúc thì thấy cái này do lỗi đọc Code của diễn đàn. Code mà có chứa dấu > hoặc < thì sẽ bị lỗi. Bạn down file biên dịch để dùng. Nếu bạn biết về lisp thì chỉ cần sửa lỗi một chút là xong.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
hhhhgggg    30
Mình cũng không hiểu sao lại bị lỗi thế. Bạn thử dùng file biên dịch này xem sao: tính toán với link

 

Mò 1 lúc thì thấy cái này do lỗi đọc Code của diễn đàn. Code mà có chứa dấu > hoặc < thì sẽ bị lỗi. Bạn down file biên dịch để dùng. Nếu bạn biết về lisp thì chỉ cần sửa lỗi một chút là xong.

Bác Pro à ! Để mọi người dễ hiểu và đều có thể sử dụng được thì bác nên hướng dẫn mọi người cách sử dụng lisp này với ! Bởi vì khi em dùng thì em dùng thế này, Cách hiểu của em về ý tưởng của các bác là thế này :

Giả sử ban đầu có 3 Text là dạng số, e mang cộng cái 1 với 2 xuất KQ vào 3 , khi mình thay đổi 1 trong 2 phần tử 1 và 2 rùi chạy Lisp thì cái tổng 3 tự động nhảy theo. Lisp hiện tại thì khi em chọn đối tượng nguồn rùi chọn đích

Thì đối tượng đích như kiểu bị hatch vùng text đó ý, Giá trị thì bằng với đối tượng nguồn, nếu dùng lệnh LGT ??? Em chưa hiểu ? mong Các bác jải thik thêm à !

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
nataca    553
Bác Pro à ! Để mọi người dễ hiểu và đều có thể sử dụng được thì bác nên hướng dẫn mọi người cách sử dụng lisp này với ! Bởi vì khi em dùng thì em dùng thế này, Cách hiểu của em về ý tưởng của các bác là thế này :

Giả sử ban đầu có 3 Text là dạng số, e mang cộng cái 1 với 2 xuất KQ vào 3 , khi mình thay đổi 1 trong 2 phần tử 1 và 2 rùi chạy Lisp thì cái tổng 3 tự động nhảy theo. Lisp hiện tại thì khi em chọn đối tượng nguồn rùi chọn đích

Thì đối tượng đích như kiểu bị hatch vùng text đó ý, Giá trị thì bằng với đối tượng nguồn, nếu dùng lệnh LGT ??? Em chưa hiểu ? mong Các bác jải thik thêm à !

Thứ nhất bạn không nên gọi mình là "Bác Pro", thứ 2 bạn nên xem kỹ lại các lệnh mình ghi chú ngay bài viết trên cùng. Có nhiều lệnh tương ứng với chức năng khác nhau. Lệnh LGT chỉ là một trong đó. Khi mà bạn thấy có màu nền ở text kết quả tức là lisp đã chạy đúng.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
daotac541    2

Em thấy lisp của bác rất hay. Nhưng khổ cái là trước em đã trót đặt lệnh tắt trùng với lệnh mà bác dùng trong lisp.

Bây giờ em down lisp về thì lại đổi lại. Bác có thể up file lisp lên cho em xin được chứ ạ ?

( em dùng được file .vlx nhưng đổi lệnh thì em chịu. Còn file .lsp của diễn đàn thì em chạy bị báo lỗi )

Cảm ơn bác nhiều!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
nataca    553
Em thấy lisp của bác rất hay. Nhưng khổ cái là trước em đã trót đặt lệnh tắt trùng với lệnh mà bác dùng trong lisp.

Bây giờ em down lisp về thì lại đổi lại. Bác có thể up file lisp lên cho em xin được chứ ạ ?

( em dùng được file .vlx nhưng đổi lệnh thì em chịu. Còn file .lsp của diễn đàn thì em chạy bị báo lỗi )

Cảm ơn bác nhiều!

Mình đã thêm link down file lisp ở bài viết đầu.

  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khá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)-------------------
;;;=============================================================================

===============
(
	(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ê)

 

Bác NATACA có thể bổ sung thêm một lệnh dùng để LINK diện tích của một Hatch vào một TEXT sẵn có được không. Mình hay dùng cách này để tính diện tích. (có thêm tính năng chọn tỉ lệ của bản vẽ, mà đơn giản để dễ biết tỉ lệ Bác cho câu lệnh "1 mét vẽ bằng mấy đơn vị bản vẽ: ". Cảm ơn BÁC, LSP rất hay.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Tue_NV    3.841

Chào Nataca cùng các bác

Dựa vào đoạn code Lisp của bạn Nataca -> Tue_NV thử làm 1 lisp Link chiều dài 1 DIMENSION với 1 đối tượng Text và đã thành công -> Phát triển thêm -> Tue_NV đã thử làm Lisp Link Nhân 1 số với chiều dài của DIMENSION nhưng không biết Code sai ở đâu?

Code sau nhân Measurement của DIMENSION với 2 nhưng bị lỗi chưa tìm ra. Mong bạn Nataca và các bác chỉ giúp

(defun C:LD (/ obn Tkq)
(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	(getint "\n Nhap chu so lam tron")
			Tkq	(strcat "%						"%						(rtos (vla-get-objectid obn) 2 0)
					">%).Measurement \\f \"%lu2"
					"%pr" (rtos ltr 2 0)
					"\">%"
					)
)
(vla-put-textstring obd Tkq)
(vl-cmdf "regen")
(princ)
)

Tue_NV xin cảm ơn

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
phamthanhbinh    3.123
Chào Nataca cùng các bác

Dựa vào đoạn code Lisp của bạn Nataca -> Tue_NV thử làm 1 lisp Link chiều dài 1 DIMENSION với 1 đối tượng Text và đã thành công -> Phát triển thêm -> Tue_NV đã thử làm Lisp Link Nhân 1 số với chiều dài của DIMENSION nhưng không biết Code sai ở đâu?

Code sau nhân Measurement của DIMENSION với 2 nhưng bị lỗi chưa tìm ra. Mong bạn Nataca và các bác chỉ giúp

(defun C:LD (/ obn Tkq)
(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	(getint "\n Nhap chu so lam tron")
			Tkq	(strcat "%						"%						(rtos (vla-get-objectid obn) 2 0)
					">%).Measurement \\f \"%lu2"
					"%pr" (rtos ltr 2 0)
					"\">%"
					)
)
(vla-put-textstring obd Tkq)
(vl-cmdf "regen")
(princ)
)

Tue_NV xin cảm ơn

Chào bác Tue_NV,

Bác hãy xem lại đoạn code này của bác Nacata:

(setq Tgt (strcat Tgt "*"

"%

(rtos (vla-get-objectid (vlax-ename->vla-object obn)) 2 0)

">%).TextString>%"

)

)

Theo mình hiểu thì hàm (strcat ....) là hàm nối các chuỗi với nhau để tạo thành chuỗi mới.

Như vậy trong đoạn code này của bác:

Tkq (strcat "%

"%

(rtos (vla-get-objectid obn) 2 0)

">%).Measurement \\f \"%lu2"

"%pr" (rtos ltr 2 0)

"\">%"

)

Nó sẽ trả về một chuỗi có chứa ký tự "2*" chứ không phải là chuỗi ký tự ".....2" "*" "........" bác ạ.

Có lẽ đó là nguyên nhân mà cái lisp của bác chưa chịu chạy đúng. Bác thử sửa chỗ này xem sao.

Thực tình mình chưa hiểu hết cái lisp của bác Nacata để vận dụng và chỉnh sửa như bác, xong mình cứ suy luận trên cơ sở cú pháp của các hàm và so sánh giữa code của bác và bác Nacata mà thôi. Nếu có sai trật, mong bác đừng giận và cho là mình múa rìu nhé.

Chúc bác khỏe và vui.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
gia_bach    1.442
Chào Nataca cùng các bác

Dựa vào đoạn code Lisp của bạn Nataca -> Tue_NV thử làm 1 lisp Link chiều dài 1 DIMENSION với 1 đối tượng Text và đã thành công -> Phát triển thêm -> Tue_NV đã thử làm Lisp Link Nhân 1 số với chiều dài của DIMENSION nhưng không biết Code sai ở đâu?

Code sau nhân Measurement của DIMENSION với 2 nhưng bị lỗi chưa tìm ra. Mong bạn Nataca và các bác chỉ giúp

(defun C:LD (/ ltr obd obn tkq)
 (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 (getint "\n Nhap chu so lam tron")
Tkq (strcat "%<\\AcExpr (%<\\AcObjProp Object(%<\\_ObjId "
	    (itoa (vla-get-objectid obn));(rtos (vla-get-objectid obn) 2 0)
	    ">%).Measurement>%) " "\\f \"%lu2%pr"
	    (itoa ltr);(rtos ltr 2 0)
	    "\">%")
)
 (vla-put-textstring obd Tkq)
 ;(vl-cmdf "regen")
 (princ))

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
pfievxd    6

haizzz, ko hiểu sao em check thử trên Cad 2007 lại ko được các bác nhỉ????(Mới thử đo chiều dài đối tượng và + text thoai ah)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
ldky2k    2

Lisp của bạn nataca thật là hay đó. Cho mình hỏi, khi sử dụng có khi trả về kết quả có khi trả về 4 kí tự "####", mình cũng không biết tại sao vậy bạn ? Mong nataca trả lời. Cám ơn.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
xuandao0708    8

Nhân đọc bài lisp ánh xạ text nay em nhờ mọi người chỉnh lại dùm em như sau:

1- Lisp ánh xạ text hiện nay mới chọn được 1 đối tượng text nguồn cho 1 đối tượng text đích, nay chỉnh lại cho đối tượng text nguồn có thể chọn được nhiều đối tượng text và tổng lại với nhau thành 1 text đích.

2- Có thể copy thêm đối tượng text nguồn nhưng nó vẫn hiểu là 1 phần của text đích.

Đây là file cad mẫu: http://www.cadviet.com/upfiles/3/mau_cadviet.dwg

Mong mọi người giúp đỡ vì em không biết 1 chút gì về lisp hết. Thank!

[/font]

  • Vote giảm 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
xuandao0708    8

Lisp của Nacata rất hay nhưng tiện đây có thể nhờ bác chỉnh thêm 1 tý nữa:

1- Mình có thể chọn đối tượng text nguồn bằng cách quét chuột vì đôi khi text số diện tích bên mình rất nhiều.

2- Mình có thể copy đối tượng text nguồn ra thêm nhưng nó vẫn hiểu text mới copy ra vẫn có thuộc tính là 1 text nguồn, sau đó thực hiện tính toán và điền vào text đích của text nguồn được copy ra.

Thank bạn nhiều.

Đây là file mẫu

http://www.cadviet.com/upfiles/3/mau_cadviet_1.dwg

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Sao mình dùng 2 lisp ll va lgt thì được còn lc, lh,ln,l\ thì đều hiện ra #### mình chọn text như hướng dẫn nhưng cứ vây thôi. Nhờ giúp đỡ. Tks nhiều.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay


×