Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
50 replies to this topic

#1 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 548 (tốt)

Đã gửi 18 October 2009 - 06:13 PM

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.
  • 18

#2 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 902 Bài viết
Điểm đánh giá: 504 (tốt)

Đã gửi 18 October 2009 - 07:33 PM

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.
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#3 vtd_xd

vtd_xd

    biết vẽ circle

  • Members
  • PipPip
  • 38 Bài viết
Điểm đánh giá: 5 (bình thường)

Đã gửi 18 October 2009 - 10:20 PM

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
  • 0
Chuc vui ve

#4 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 548 (tốt)

Đã gửi 18 October 2009 - 11:35 PM

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.
  • 0

#5 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4283 Bài viết
Điểm đánh giá: 3779 (đỉnh cao)

Đã gửi 19 October 2009 - 05:41 AM

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
  • 1

#6 hhhhgggg

hhhhgggg

    biết dimedit

  • Members
  • PipPipPipPipPip
  • 393 Bài viết
Điểm đánh giá: 30 (tàm tạm)

Đã gửi 19 October 2009 - 07:47 AM

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
  • 0
Hoàng Giang

#7 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 548 (tốt)

Đã gửi 19 October 2009 - 08:02 AM

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.
  • 3

#8 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 548 (tốt)

Đã gửi 19 October 2009 - 08:09 AM

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.
  • 0

#9 hhhhgggg

hhhhgggg

    biết dimedit

  • Members
  • PipPipPipPipPip
  • 393 Bài viết
Điểm đánh giá: 30 (tàm tạm)

Đã gửi 19 October 2009 - 09:50 AM

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 à !
  • 0
Hoàng Giang

#10 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 548 (tốt)

Đã gửi 19 October 2009 - 09:58 AM

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.
  • 0

#11 daotac541

daotac541

    biết vẽ circle

  • Members
  • PipPip
  • 30 Bài viết
Điểm đánh giá: 2 (bình thường)

Đã gửi 19 October 2009 - 11:17 AM

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!
  • 0

#12 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 548 (tốt)

Đã gửi 19 October 2009 - 11:51 AM

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.
  • 2

#13 xaakiii_mboet

xaakiii_mboet

    biết vẽ line

  • Members
  • PipPip
  • 21 Bài viết
Điểm đánh giá: 6 (bình thường)

Đã gửi 30 November 2009 - 04:56 PM

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.
  • 0

#14 master_worse

master_worse

    biết lệnh offset

  • Advance Member
  • PipPipPip
  • 170 Bài viết
Điểm đánh giá: 86 (tàm tạm)

Đã gửi 30 November 2009 - 05:22 PM

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ái này thì ở đây: http://www.cadviet.c...o...13131&st=20
  • 1

Ngu dốt không đáng thẹn bằng thiếu ý chí học hỏi


Tri thức làm người ta khiêm tốn, ngu si làm người ta kiêu ngạo (Ngạn ngữ Anh)


#15 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4283 Bài viết
Điểm đánh giá: 3779 (đỉnh cao)

Đã gửi 07 April 2010 - 08:42 AM

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 "%<\\AcExpr (2*"
"%<\\AcObjProp Object(%<\\_ObjId "
(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
  • 0

#16 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 5990 Bài viết
Điểm đánh giá: 3102 (tuyệt vời)

Đã gửi 07 April 2010 - 12:13 PM

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 "%<\\AcExpr (2*"
"%<\\AcObjProp Object(%<\\_ObjId "
(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 "*"
"%<\\AcObjProp Object(%<\\_ObjId "
(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 "%<\\AcExpr (2*"
"%<\\AcObjProp Object(%<\\_ObjId "
(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.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#17 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1400 Bài viết
Điểm đánh giá: 1408 (rất tốt)

Đã gửi 07 April 2010 - 12:33 PM

[quote name='Tue_NV' post='91982' date='Apr 7 2010, 8:42']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))

  • 1

#18 pfievxd

pfievxd

    biết vẽ spline

  • Members
  • PipPip
  • 94 Bài viết
Điểm đánh giá: 6 (bình thường)

Đã gửi 04 November 2010 - 08:51 PM

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)
  • 0

#19 ldky2k

ldky2k

    biết vẽ line

  • Members
  • PipPip
  • 23 Bài viết
Điểm đánh giá: 2 (bình thường)

Đã gửi 05 November 2010 - 09:20 PM

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.
  • 0

#20 pfievxd

pfievxd

    biết vẽ spline

  • Members
  • PipPip
  • 94 Bài viết
Điểm đánh giá: 6 (bình thường)

Đã gửi 07 November 2010 - 08:44 AM

Ah, vừa đọc bài gốc Link Text, thì ra là do chưa REGEN các bác ah :)
  • 0