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

Hỏi về Lisp (thuật toán, ý tưởng, coding,...)

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

Các bác ơi giờ muốn đóng gói đống lisp với menu và DCL thành một file cài đặt (ko biết diễn đạt đúng ko?) thì làm thế nào được ah. Em thấy nhìn cho nó có vẻ Pro hơn thôi ah

ah, mà cái phần viết DCL của Visual lisp Editor của Cad nó ko tự căn chỉnh như khi viết Lisp phải ko ah?

Muốn đóng gói LSP và DCL thì làm đuợc bằng cách gói chung chúng lại thành VLX. Hoặc có thể viết luôn code DCL vào chung 1 file LSP. Còn menu thì chẳng bao giờ mình dùng đến nó cả nên không bít <_<

Visual lisp Editor có hỗ trợ code DCL. khi tạo new file bạn hãy save nó với định dạng DCL trước khi viết code. Ngoài ra nó còn hỗ trợ xem preview các thành phàn của hộp thoại. Vào Tool -> Interface tool

  • 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

Ý em là nó không hỗ trợ trình bày cơ, để mình dễ quản lý khi viết ấy mà, như lisp thì các lệnh cùng cấp xếp ngang nhau, các lệnh nằm trong 1 lệnh (while, if, ..)thì khi xuống dòng để viết nó tự động thụt lùi vào đầu dòng cho mình í

+ Ý em đóng góil là tạo được cái File .exe 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

Ngại quá :leluoi: . Hôm nay em làm cái Líp chuyển tất cả các đối tượng trên bản vẽ về "bylayer" hết. Nhưng khổ nỗi loay hoay mãi không sao làm đc với các đối tuợng trong BLOCK. Em cũng thử mày mò bằng hàm con (UPWB) mà bác Tue hay bác thanhbinh dùng mà chả đc.

 

(defun moddxf (dxf chdxf ss) (entmod (subst (cons dxf chdxf) (assoc dxf (entget ss)) (entget ss))))
(defun c:bylayer (/ ss en el i)
(vl-load-com)
(princ "\nChuyen ve ByLayer")
(setq ss (ssget "x"))
( setq i 0)
(while (< i (sslength ss)) 
  (setq en (ssname ss i))
	(if (/= (cdr (assoc 62 (entget en))) nil)
		(moddxf 62 256 en)
	)	
  (setq el (vlax-ename->vla-object en))
		    (vlax-put-property el 'Linetype "ByLayer")
		    (vlax-put-property el 'Lineweight -1)
  (setq i (1+ i))
)
)

 

Các bác sửa giúp em cho nó chạy đc luôn cả trong block với. Viết code theo kiểu của hàm (UPWB) ý nhé. để em ngâm cứu nó phát.

 

VD về hàm con (UPWB): http://www.cadviet.com/forum/index.php?sho...st&p=105502

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
Ngại quá :leluoi: . Hôm nay em làm cái Líp chuyển tất cả các đối tượng trên bản vẽ về "bylayer" hết. Nhưng khổ nỗi loay hoay mãi không sao làm đc với các đối tuợng trong BLOCK. Em cũng thử mày mò bằng hàm con (UPWB) mà bác Tue hay bác thanhbinh dùng mà chả đc.

 

(defun moddxf (dxf chdxf ss) (entmod (subst (cons dxf chdxf) (assoc dxf (entget ss)) (entget ss))))
(defun c:bylayer (/ ss en el i)
(vl-load-com)
(princ "\nChuyen ve ByLayer")
(setq ss (ssget "x"))
( setq i 0)
(while (< i (sslength ss)) 
  (setq en (ssname ss i))
	(if (/= (cdr (assoc 62 (entget en))) nil)
		(moddxf 62 256 en)
	)	
  (setq el (vlax-ename->vla-object en))
		    (vlax-put-property el 'Linetype "ByLayer")
		    (vlax-put-property el 'Lineweight -1)
  (setq i (1+ i))
)
)

 

Các bác sửa giúp em cho nó chạy đc luôn cả trong block với. Viết code theo kiểu của hàm (UPWB) ý nhé. để em ngâm cứu nó phát.

 

VD về hàm con (UPWB): http://www.cadviet.com/forum/index.php?sho...st&p=105502

Mình thì chưa biết dùng cái thuật đệ quy của bác Tue_VN bạn tham khảo thử cái code trong bài viết này xem http://www.cadviet.com/forum/index.php?showtopic=27683 bài số #8

  • 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
Ngại quá :leluoi: . Hôm nay em làm cái Líp chuyển tất cả các đối tượng trên bản vẽ về "bylayer" hết. Nhưng khổ nỗi loay hoay mãi không sao làm đc với các đối tuợng trong BLOCK. Em cũng thử mày mò bằng hàm con (UPWB) mà bác Tue hay bác thanhbinh dùng mà chả đc.

 

(defun moddxf (dxf chdxf ss) (entmod (subst (cons dxf chdxf) (assoc dxf (entget ss)) (entget ss))))
(defun c:bylayer (/ ss en el i)
(vl-load-com)
(princ "\nChuyen ve ByLayer")
(setq ss (ssget "x"))
( setq i 0)
(while (	  (setq en (ssname ss i))
	(if (/= (cdr (assoc 62 (entget en))) nil)
		(moddxf 62 256 en)
	)	
  (setq el (vlax-ename->vla-object en))
		    (vlax-put-property el 'Linetype "ByLayer")
		    (vlax-put-property el 'Lineweight -1)
  (setq i (1+ i))
)
)

 

Các bác sửa giúp em cho nó chạy đc luôn cả trong block với. Viết code theo kiểu của hàm (UPWB) ý nhé. để em ngâm cứu nó phát.

 

VD về hàm con (UPWB): http://www.cadviet.com/forum/index.php?sho...st&p=105502

Chào bạn nguyentuyen6

Bạn xài thử cái này xem nhé, mình chưa chạy thử, chỉ áp dụng cái bạn đã viết vào thuật toán đệ quy của bác Tue_NV cho các đối tượng block mà thôi. Hy vọng nó đúng ý bạn.

(defun moddxf (dxf chdxf ss) (entmod (subst (cons dxf chdxf) (assoc dxf (entget ss)) (entget ss))))
(defun c:bylayer (/ ss en el i)
(vl-load-com)
(princ "\nChuyen ve ByLayer")
(setq ss (ssget "x"))
( setq i 0)
(while (         (setq en (ssname ss i))
        (if (/= (cdr (assoc 0 en)) "INSERT")
            (progn
            (if (/= (cdr (assoc 62 (entget en))) nil)
            (moddxf 62 256 en)
            )
            (setq el (vlax-ename->vla-object en))
            (vlax-put-property el 'Linetype "ByLayer")
            (vlax-put-property el 'Lineweight -1)
            )
            (upwblock en)
         )

         (setq i (1+ i))
)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun upwblock ( blk / s en els el)
(setq s (cdr (assoc 2 (entget blk))))
(setq en (cdr (assoc -2 (tblsearch "BLOCK" s))))
(while en
       (setq els (entget en))
       (if (wcmatch (cdr (assoc 0 els)) "INSERT")
           (UPWBlock en)
           (progn
             (if (/= (cdr (assoc 62 (entget en))) nil)
             (moddxf 62 256 en)
             )
             (setq el (vlax-ename->vla-object en))
             (vlax-put-property el 'Linetype "ByLayer")
             (vlax-put-property el 'Lineweight -1)
           )
        )
        (setq en (entnext en))
)
)

  • 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

@phamngoctukts: Cảm ơn bác nhé. Hix. Em nhìn vào cái đoạn Líp của bác đưa mà hoa hết cả mắt...

 

@phamthanhbinh: Cảm ơn bác bình. Cái líp của bác chạy ngon rồi. Cái hàm (upwblock) em hiểu máy móc nó là thế này.

 

Kiểm tra có phải Block hay ko. Nếu là block thì chạy hàm (upwblock)

 

(defun upwblock ( blk / s en els el)
(setq s (cdr (assoc 2 (entget blk))))
(setq en (cdr (assoc -2 (tblsearch "BLOCK" s))))
(while en
(setq els (entget en))
(if (wcmatch (cdr (assoc 0 els)) "INSERT")
(UPWBlock en)

........Làm cái gì thì làm ở đây.........

(entupd en)
(setq en (entnext en))
)
)

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

Mình có sưu tầm 1 lisp về đánh số tăng dần, không biết sao không chạy được. Mong được các anh sửa giúp :

;****************** COPY HANG LOAT TANG DAN ***************************************ok

(defun c:ct (/ ang x y ent tg tg1tg2 num_r num_c num_inc dis_r dis_c num top idnum
              dx dy bottom inc tgnum attr attr_ent t_base b_base locat value 
              deci stnum loca1 loca2 tt count inctg inctg1 bpoint mx my nx ny bx by)
 (setq idnum 0)
 (while (/= idnum 1)
   (setq ent (entsel "\nHay lua chon so ma ban muon copy : "))
   (if ent
     (progn
       (setq e (car ent))
       (setq tg (entget e))
       (if (= (cdr (assoc 0 tg)) "TEXT") (setq idnum 1))

     )
     (princ)
   )
 )

 (setq num_inc (getreal "\nHay nhap he so tang giam <1> : "))
 (if (= num_inc nil) (setq num_inc 1))

 (setq bpoint (getpoint "\nChon diem goc de copy : "))
 (setq x (car bpoint))
 (setq y (car(cdr bpoint)))

 (if (and (= (cdr (assoc 72 tg)) 0) (= (cdr (assoc 73 tg)) 0))
   (progn
     (setq bx (car (cdr (assoc 10 tg))))
     (setq by (car (cdr (cdr (assoc 10 tg)))))
   )
   (progn
     (setq bx (car (cdr (assoc 11 tg))))
     (setq by (car (cdr (cdr (assoc 11 tg)))))
   )
 )

 (setq attr (cdr tg))	;attr chua cac thuoc tinh cua Entity nguon
 (setq tg (cdr (assoc 1 tg)))
 (setq inc 0)
 (setq tg1 "")
 (setq t_base "")
 (setq b_base "")
 (setq idnum 0)
 (setq top 0)
 (setq bottom 0)
 (setq stnum "") 
 (setq deci 0) 
 (repeat  (strlen tg)    
   (if  (or (and (> (ascii (setq tgnum (substr tg (- (strlen tg) inc) 1))) 47) 
                   (< (ascii (setq tgnum (substr tg (- (strlen tg) inc) 1))) 58))
                   (= (ascii (setq tgnum (substr tg (- (strlen tg) inc) 1))) 32)
                   (= (ascii (setq tgnum (substr tg (- (strlen tg) inc) 1))) 46))
     (progn  
         (if  (= (ascii (setq tgnum (substr tg (- (strlen tg) inc) 1))) 46) (setq deci inc))      
         (if (= inc 0)
            (progn
              (setq idnum 1)
              (if  (= (ascii (setq tgnum (substr tg (- (strlen tg) inc) 1))) 46) 
                 (setq b_base (strcat "." b_base)))               
            )
         )
         (if (= bottom 1) (progn (setq bottom 0) (setq idnum 1) (setq top 1)))
         (if (and (= idnum 0) (= top 1)) (setq t_base (strcat tgnum t_base)))
         (if (= idnum 1) 
           (progn    
             (if (and (= tgnum "0") (> inc 0)) (setq stnum (strcat stnum "0")) (setq stnum ""))
             (setq tg1 (strcat tgnum tg1))
           )
         )
     )
     (if (= inc 0) 
       (progn
         (setq b_base (strcat tgnum b_base))
         (setq bottom 1)
       )
       (if (= bottom 1)
         (setq b_base (strcat tgnum b_base))
         (progn
           (setq top 1)
           (setq t_base (strcat tgnum t_base))
           (if (= idnum 1) (setq idnum 0))
         )
       )
     )
   )
   (setq inc (+ inc 1))
 )
 (if (= tg1 "") (exit))
 (setq num (atof tg1))
 (setq count 1)

 (while (setq bpoint (getpoint "\nChon diem copy tiep theo : "))
    (setq num (+ num num_inc))
    (setq value (strcat t_base (strcat stnum (rtos num 2 deci)) b_base))
    (setq nx (car bpoint))
    (setq ny (car(cdr bpoint)))
    (setq dx (- nx x))
    (setq dy (- ny y))
    (setq mx (car (getvar "ucsxdir")))
    (setq my (car (cdr (getvar "ucsxdir"))))
    (setq loca1 (+ bx (* mx dx)))
    (setq loca2 (+ by (* my dx)))
    (setq mx (car (getvar "ucsydir")))
    (setq my (car (cdr (getvar "ucsydir"))))
    (setq loca1 (+ loca1 (* mx dy)))
    (setq loca2 (+ loca2 (* my dy)))
    (setq attr_ent (subst (cons 1 value) (assoc 1 attr) attr))
    (if (and (= (cdr (assoc 72 attr_ent)) 0) (= (cdr (assoc 73 attr_ent)) 0))
      (setq attr_ent (subst (list 10 loca1 loca2 0) (assoc 10 attr_ent) attr_ent))
      (setq attr_ent (subst (list 11 loca1 loca2 0) (assoc 11 attr_ent) attr_ent))
    )
    (entmake attr_ent)
    (setq count (+ count 1))
 )	 ;end while
 (princ)
)

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
Mình có sưu tầm 1 lisp về đánh số tăng dần, không biết sao không chạy được. Mong được các anh sửa giúp :

;****************** COPY HANG LOAT TANG DAN ***************************************ok

(defun c:ct (/ ang x y ent tg tg1tg2 num_r num_c num_inc dis_r dis_c num top idnum
              dx dy bottom inc tgnum attr attr_ent t_base b_base locat value 
              deci stnum loca1 loca2 tt count inctg inctg1 bpoint mx my nx ny bx by)
 (setq idnum 0)
 (while (/= idnum 1)
   (setq ent (entsel "\nHay lua chon so ma ban muon copy : "))
   (if ent
     (progn
       (setq e (car ent))
       (setq tg (entget e))
       (if (= (cdr (assoc 0 tg)) "TEXT") (setq idnum 1))
     )
     (princ)
   )
 )

 (setq num_inc (getreal "\nHay nhap he so tang giam <1> : "))
 (if (= num_inc nil) (setq num_inc 1))

 (setq bpoint (getpoint "\nChon diem goc de copy : "))
 (setq x (car bpoint))
 (setq y (car(cdr bpoint)))

 (if (and (= (cdr (assoc 72 tg)) 0) (= (cdr (assoc 73 tg)) 0))
   (progn
     (setq bx (car (cdr (assoc 10 tg))))
     (setq by (car (cdr (cdr (assoc 10 tg)))))
   )
   (progn
     (setq bx (car (cdr (assoc 11 tg))))
     (setq by (car (cdr (cdr (assoc 11 tg)))))
   )
 )

 (setq attr (cdr tg))	;attr chua cac thuoc tinh cua Entity nguon
 (setq tg (cdr (assoc 1 tg)))
 (setq inc 0)
 (setq tg1 "")
 (setq t_base "")
 (setq b_base "")
 (setq idnum 0)
 (setq top 0)
 (setq bottom 0)
 (setq stnum "") 
 (setq deci 0) 
 (repeat  (strlen tg)    
   (if  (or (and (> (ascii (setq tgnum (substr tg (- (strlen tg) inc) 1))) 47) 
                   (< (ascii (setq tgnum (substr tg (- (strlen tg) inc) 1))) 58))
                   (= (ascii (setq tgnum (substr tg (- (strlen tg) inc) 1))) 32)
                   (= (ascii (setq tgnum (substr tg (- (strlen tg) inc) 1))) 46))
     (progn  
         (if  (= (ascii (setq tgnum (substr tg (- (strlen tg) inc) 1))) 46) (setq deci inc))      
         (if (= inc 0)
            (progn
              (setq idnum 1)
              (if  (= (ascii (setq tgnum (substr tg (- (strlen tg) inc) 1))) 46) 
                 (setq b_base (strcat "." b_base)))               
            )
         )
         (if (= bottom 1) (progn (setq bottom 0) (setq idnum 1) (setq top 1)))
         (if (and (= idnum 0) (= top 1)) (setq t_base (strcat tgnum t_base)))
         (if (= idnum 1) 
           (progn    
             (if (and (= tgnum "0") (> inc 0)) (setq stnum (strcat stnum "0")) (setq stnum ""))
             (setq tg1 (strcat tgnum tg1))
           )
         )
     )
     (if (= inc 0) 
       (progn
         (setq b_base (strcat tgnum b_base))
         (setq bottom 1)
       )
       (if (= bottom 1)
         (setq b_base (strcat tgnum b_base))
         (progn
           (setq top 1)
           (setq t_base (strcat tgnum t_base))
           (if (= idnum 1) (setq idnum 0))
         )
       )
     )
   )
   (setq inc (+ inc 1))
 )
 (if (= tg1 "") (exit))
 (setq num (atof tg1))
 (setq count 1)

 (while (setq bpoint (getpoint "\nChon diem copy tiep theo : "))
    (setq num (+ num num_inc))
    (setq value (strcat t_base (strcat stnum (rtos num 2 deci)) b_base))
    (setq nx (car bpoint))
    (setq ny (car(cdr bpoint)))
    (setq dx (- nx x))
    (setq dy (- ny y))
    (setq mx (car (getvar "ucsxdir")))
    (setq my (car (cdr (getvar "ucsxdir"))))
    (setq loca1 (+ bx (* mx dx)))
    (setq loca2 (+ by (* my dx)))
    (setq mx (car (getvar "ucsydir")))
    (setq my (car (cdr (getvar "ucsydir"))))
    (setq loca1 (+ loca1 (* mx dy)))
    (setq loca2 (+ loca2 (* my dy)))
    (setq attr_ent (subst (cons 1 value) (assoc 1 attr) attr))
    (if (and (= (cdr (assoc 72 attr_ent)) 0) (= (cdr (assoc 73 attr_ent)) 0))
      (setq attr_ent (subst (list 10 loca1 loca2 0) (assoc 10 attr_ent) attr_ent))
      (setq attr_ent (subst (list 11 loca1 loca2 0) (assoc 11 attr_ent) attr_ent))
    )
    (entmake attr_ent)
    (setq count (+ count 1))
 )	 ;end while
 (princ)
)

 

Lisp dùng bình thường mà khaosat2009, nhưng chỉ áp dụng được cho TEXT thôi chứ không hổ trợ MTEXT.

Bạn xem lại thử! Diễn đàn có thể bổ sung thêm để hổ trợ cho cả MTEXT không nhỉ!

Chỉnh sửa theo phamthanhbinh

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
@phamngoctukts: Cảm ơn bác nhé. Hix. Em nhìn vào cái đoạn Líp của bác đưa mà hoa hết cả mắt...

 

@phamthanhbinh: Cảm ơn bác bình. Cái líp của bác chạy ngon rồi. Cái hàm (upwblock) em hiểu máy móc nó là thế này.

 

Kiểm tra có phải Block hay ko. Nếu là block thì chạy hàm (upwblock)

 

(defun upwblock ( blk / s en els el)
(setq s (cdr (assoc 2 (entget blk))))
(setq en (cdr (assoc -2 (tblsearch "BLOCK" s))))
(while en
(setq els (entget en))
(if (wcmatch (cdr (assoc 0 els)) "INSERT")
(UPWBlock en)

........Làm cái gì thì làm ở đây.........

(entupd en)
(setq en (entnext en))
)
)

Chào bạn nguyentuyen6,

Đúng là làm cái gì thì làm ở đây, nhưng vấn đề là làm thế nào bạn ạ. Hàm nào trong lisp cũng tương tự như bạn hiểu thôi mà. Trong hàm upwblock, cái bạn cần lưu ý là việc sử dụng phép đệ quy để khi hàm gặp đối tượng block thì sẽ lặp lại chính nó. Việc này tuy đơn giản vậy nhưng bạn cũng nên tìm hiểu thêm chút chút về cái phép đệ quy này bạn ạ. Có nhiều thứ hay ra phết. Hề hề hề.

Trên diễn đàn đã có nói về vấn đề này, nhờ đó mình mới vỡ vạc được chút xíu, mình nhớ không nhầm thì hình như cũng nằm trong topic này thì phải. Bạn kiếm thử coi nhé. Các bác ấy chỉ hay lắm.....

Chúc bạn thành công.

  • 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
Lisp dùng bình thường mà khaosat2009, nhưng chỉ áp dụng được cho TEXT thôi chứ không hổ trợ MTEXT.

Bạn xem lại thử! Diễn đàn có thể bổ sung thêm để hổ trợ cho cả MTEXT không nhỉ!

Chào bạn Hochoaivandot,

Hề hề hề,

Mình đã xem cái lisp này, với cấu trúc lísp này việc bổ sung nó để có thể chạy được với Mtext là rất khó chịu ,vì lisp dựa trên việc xác định các ký tự trong chuỗi text được lấy từ mã DXF 1 của đối tượng. Với Mtext, chuỗi này còn bao gồm cả các mã về định dạng của Mtext như kiểu ,font, ..... mà việc dùng font và kiểu Mtext của người sử dụng lại khá đa dạng chứ không phải chỉ có một kiểu duy nhất. Do đó việc xác định đúng vị trí của các ký tự này là một vấn đề cần phải dựa vào từng bản vẽ cụ thể mới được bạn ạ.

Theo thiển ý của mình thì như vậy thà làm một lisp riêng sẽ tốt hơn, sau này người sử dụng sẽ căn cứ vào cái Mtext cụ thể để hiệu chỉnh lisp cho phù hợp là OK.

Muốn vậy bạn phải post một cái bản vẽ có Mtext và cái kết quả bạn cần bạn nhé.

Chúc bạn vui.

Chỉnh sửa theo phamthanhbinh
  • 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
Chào bạn Hôchaivandot,

Hề hề hề,

Mình đã xem cái lisp này, với cấu trúc lísp này việc bổ sung nó để có thể chạy được với Mtext là rất khó chịu ,vì lisp dựa trên việc xác định các ký tự trong chuỗi text được lấy từ mã DXF 1 của đối tượng. Với Mtext, chuỗi này còn bao gồm cả các mã về định dạng của Mtext như kiểu ,font, ..... mà việc dùng font và kiểu Mtext của người sử dụng lại khá đa dạng chứ không phải chỉ có một kiểu duy nhất. Do đó việc xác định đúng vị trí của các ký tự này là một vấn đề cần phải dựa vào từng bản vẽ cụ thể mới được bạn ạ.

Theo thiển ý của mình thì như vậy thà làm một lisp riêng sẽ tốt hơn, sau này người sử dụng sẽ căn cứ vào cái Mtext cụ thể để hiệu chỉnh lisp cho phù hợp là OK.

Muốn vậy bạn phải post một cái bản vẽ có Mtext và cái kếp quả bạn cần bạn nhé.

Chúc bạn vui.

 

Chào anh phamthanhbình.

Em muốn có 1 lisp tổng quảt để có thể dùng cho mọi trường hợp.

Với trường hợp Mtext không định dạng thì mọi chuyện không phải bàn.

Với trường hợp Mtext có định dạng thì Khó khăn anh đã nêu ra đúng quá rồi.

Tuy nhiên em nghĩ các định dạng được đưa thêm vào mã dxf 1 của mtext tuy đa dạng nhưng đều có quy luật.

Sau đây là một số nội dung MTEXT lấy theo mã DXF1

(1 . "{\\fTimes New Roman|b0|i0|c0|p18;\\W1.3;\\T1.4;\\C2;STT : 2}")

(1 . "\\pi-3,l3,t3;{\\fTimes New Roman|b0|i0|c0|p18;\\T0.75;\\C1;STT : 2}")

Nội dung chính của MTEXT là STT : 2 được giới hạn từ dấu ; cuối cùng đến dấu } sau cùng

(Tấc nhiên trường hợp trong ndung chính của MTEXT có dâus ; thì quy luật này không đúng Ví dụ STT;=2 Tuy nhiên thợp này hiếm)

Không biết em test có thiều trường hợp nào không, chứ nếu quy luật là như vậy thì ta có thể làm được mục đích của lisp trên cho MTEXT.

Thân 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
Nhờ các anh giúp hổ trợ lisp đánh số tăng dần hoạt động với MTEXT.

Cám ơn

Chào bạn khaosat2009,

Bạn không đọc các bài póst trước hay sao??? Như đã nói với mtext do có nhiều kiểu định dạng khác nhau nên rất khó để làm một lisp cho mọi trường hợp, chỉ có thể làm cho một trường hợp cụ thể rồi từ đó các bạn tự hiệu chỉnh cho nó phù hợp với cái font, kiểu,,,, mtext mà các bạn sử dụng. Bạn muốn làm thì phải post một cái bản vẽ cụ thể lên chứ, nói chung chung vậy thì chịu chết. Nhớ là phải post đúng cái bạn đang cần để đỡ mất công chỉnh sửa lại lisp và ít nhất bạn cũng có cái dùng và có thời gian để ngâm cứu chỉnh sửa sau.

Mình nhắc lại là việc chỉnh sửa về sau thì tự các bạn phải cố gắng chứ đừng ỷ lại vì mọi người trên diễn đàn không phải lúc nào cũng giúp các bạn được ngay đâu, mà công việc của các bạn thì không ai làm hộ được. Nếu có gì khó khăn trong lúc chỉnh sửa hãy post lên mọi người có thể góp ý thôi, rồi các bạn tự làm, Có vậy các bạn mới chủ động được trong công việc của mình và mới đáp ứng được yêu cầu của công việc. Mong các bạn hãy cố gắng hơn.

  • 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
Chào bạn khaosat2009,

Bạn không đọc các bài póst trước hay sao??? Như đã nói với mtext do có nhiều kiểu định dạng khác nhau nên rất khó để làm một lisp cho mọi trường hợp, chỉ có thể làm cho một trường hợp cụ thể rồi từ đó các bạn tự hiệu chỉnh cho nó phù hợp với cái font, kiểu,,,, mtext mà các bạn sử dụng. Bạn muốn làm thì phải post một cái bản vẽ cụ thể lên chứ, nói chung chung vậy thì chịu chết. Nhớ là phải post đúng cái bạn đang cần để đỡ mất công chỉnh sửa lại lisp và ít nhất bạn cũng có cái dùng và có thời gian để ngâm cứu chỉnh sửa sau.

Mình nhắc lại là việc chỉnh sửa về sau thì tự các bạn phải cố gắng chứ đừng ỷ lại vì mọi người trên diễn đàn không phải lúc nào cũng giúp các bạn được ngay đâu, mà công việc của các bạn thì không ai làm hộ được. Nếu có gì khó khăn trong lúc chỉnh sửa hãy post lên mọi người có thể góp ý thôi, rồi các bạn tự làm, Có vậy các bạn mới chủ động được trong công việc của mình và mới đáp ứng được yêu cầu của công việc. Mong các bạn hãy cố gắng hơn.

Bác nhắc lại với ông Khaosat2009 này làm chi cho mệt bác ơi. Từ hồi em chân uớt chân khô đến diễn đàn này đã đuợc gần 2 năm rồi mà ông ấy vẫn vậy. Vẫn cái thói ỷ lại ấy, vẫn những yêu cầu nghe nhiều đến fát nhàm ấy, cũng đã làm khối người mất hết kiên nhẫn rùi <_<

  • 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
Em muốn tạo file chứa Block E-CSB để thực hiện đoạn lisp này thì làm thế nào ah :

(Entmake (List(cons 0 "INSERT")(cons 2 "E-CSB")(cons 10 p51)))

Mọi người cho mình hỏi là tại sao mã dxf 0 mình đọc help thấy ghi là entity type, vậy thì tại sao block lại là "insert" như bạn pfievxd trên kia viết, và polyline có phải là (cons 0 "polyline") không? Xin lỗi nếu câu hỏi của mình là gà.

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
Chào bạn Hochoaivandot,

Hề hề hề,

Mình đã xem cái lisp này, với cấu trúc lísp này việc bổ sung nó để có thể chạy được với Mtext là rất khó chịu ,vì lisp dựa trên việc xác định các ký tự trong chuỗi text được lấy từ mã DXF 1 của đối tượng. Với Mtext, chuỗi này còn bao gồm cả các mã về định dạng của Mtext như kiểu ,font, ..... mà việc dùng font và kiểu Mtext của người sử dụng lại khá đa dạng chứ không phải chỉ có một kiểu duy nhất. Do đó việc xác định đúng vị trí của các ký tự này là một vấn đề cần phải dựa vào từng bản vẽ cụ thể mới được bạn ạ.

Theo thiển ý của mình thì như vậy thà làm một lisp riêng sẽ tốt hơn, sau này người sử dụng sẽ căn cứ vào cái Mtext cụ thể để hiệu chỉnh lisp cho phù hợp là OK.

Muốn vậy bạn phải post một cái bản vẽ có Mtext và cái kết quả bạn cần bạn nhé.

Chúc bạn vui.

 

Chào anh phamthanhbinh một lần nữa.

Mình có tìm được 1 lisp trên mạng liên quan đến định dạng của Mtext.

Lisp này tách lấy phần nội dung chính của Mtext. Nếu đem bổ sung cho lisp đánh số tăng dần mà khaosat2009 upload thì cơ bản giải quyết được chức năng cho Mtext.

Tuy nhiên mình thấy lisp của anh ssg tổng quát hơn cho yêu cầu đánh số tăng dần (tăng cho cả chữ và chọn cả bước tăng), Mình ghép với líp mình sưu tầm như sau:

 

;;;-------------------------------------------------
(defun dxf (code e) (cdr (assoc code (entget e))))
(defun etype (e);;;Entity Type
(cdr (assoc 0 (entget e)))
)
;;;-------------------------------------------------
(defun wtxt (txt p / sty d h);;;Write txt on graphic screen, defaul setting
(setq
sty (getvar "textstyle")
d (tblsearch "style" sty)
h (cdr (assoc 40 d))
)
(if (= h 0) (setq h (cdr (assoc 42 d))))
(entmake
(list (cons 0 "TEXT") (cons 7 sty) (cons 1 txt) (cons 10 p) (cons 40 h) (assoc 41 d))
)
)
(defun wtxtt (txt p h / sty d);;;Write txt on graphic screen, defaul setting
(setq
sty (getvar "textstyle")
d (tblsearch "style" sty)
)
(if (= h 0) (setq h (cdr (assoc 42 d))))
(entmake
(list (cons 0 "TEXT") (cons 7 sty) (cons 1 txt) (cons 10 p) (cons 40 h) (assoc 41 d))
)
)
;;;-------------------------------------------------
(defun incN (n dn / n2 i n1);;;Increase number n
(setq
n2 (itoa (+ dn (atoi n)))
i (- (strlen n) (strlen n2))
)
(if (> i 0) (setq n1 (substr n 1 i)) (setq n1 ""))
(strcat n1 n2)
)
;;;-------------------------------------------------
(defun incC (c / i c1 c2);;;Increase character c
(setq
i (strlen c)
c1 (substr c 1 (- i 1))
c2 (chr (1+ (ascii (substr c i 1))))
)
(if (or (= c2 "{") (= c2 "["))
(progn (command "erase" (entlast) "") (alert "Over character!") (exit))
(strcat c1 c2)
)
)
;;;-------------------------------------------------
(defun MTEXTCF0 (str / j len sub1 sig)
(setq sig "")
(setq j 1)
(setq len (strlen str))
(while (<= j len)
(setq sub1 (substr str j 1))
(if (= sub1 "\\")
(progn
	(setq j (1+ j))
	(setq sub1 (substr str j 1))
	(if (or (= sub1 "{") (= sub1 "}") (= sub1 "\\") (= sub1 "P") (= sub1 "L"))
		(setq sig (strcat sig "\\" sub1))
		(progn
			(while (and (/= sub1 ";") (<= j len))
				(setq j (1+ j))
				(setq sub1 (substr str j 1))
			)
		)
	)
)
(if (and (/= sub1 "{") (/= sub1 "}"))
(setq sig (strcat sig sub1))
)
)
(setq j (1+ j))
)
sig
)
;;;-------------------------------------------------
(defun C:coi( / e dn p1 cn c n p2 dat)
(vl-load-com)
(setq
e (car (entsel "\nSelect template text:"))
dn (getint "\nIncrement <1>: ")
p1 (getpoint "\nBase point:")
cn (cdr (assoc 1 (entget e)))
cn1 (MTEXTCF0 cn) cn2 cn1
)
(if (not dn) (setq dn 1))
(if (= cn1 "") (setq cn1 "1"))
(setq
c (vl-string-right-trim "0 1 2 3 4 5 6 7 8 9" cn1)
n (vl-string-subst "" c cn1)
)
(while (setq p2 (getpoint p1 "\nNew point : "))
(command "copy" e "" p1 p2)
(if (= n "") 
	(setq cn1 (incC cn1))
	(setq cn1 (strcat c (incN (vl-string-subst "" c cn1) dn))) 
)
(setq dat (entget (entlast)))
(setq cn3 (vl-string-subst cn1 cn2 cn))
(setq dat (subst (cons 1 cn3) (assoc 1 dat) dat)	)
(entmod dat)
)
(princ)
)

Trường hợp nội dung MTEXT ghi tiếng việt có dấu dùng font Unicode thì bị lỗi. Mong các anh nghiên cứu sửa lỗi này và phát hiện những lỗi khác để lisp tổng quát hơ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
Mình có lisp tao lớp , hatch, xin hỏi các dấu "" có ý nghỉa gì :

defun c:TaoL()

(command "layer" "m" "!chu" "c" "3" "" "")

(command "style" "!vnAvanH" ".VnAvantH" "" "" "" "" "")

(princ)

)

 

va hatch

(command "hatch" "p199a" "2" "0" "L" "100,-4.5" "")

 

Mong được hướng dẫn . Cám ơn

Dấu "" tức là kí tự trống là 1 lần enter đó bạn ạ.

  • 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
Trong lệnh tạo hatch các dấu trong "" là gì đó bạn

lệnh tạo hatch là (command "hatch" "p199a" "2" "0" "L" "100,-4.5" "")

p199a: là tên hatch

2: là tỉ lệ của hatch

0: là góc quay

L: là lúc select mà ở đây dùng l tức là last chọn đối tượng cuối cùng.

mình thấy thế là đủ và không hiểu "100,-4.5" "" là gì vì không cần đến.

Bạn muốn kiểm tra thì dùng lệnh -hatch hoặc (command "hatch")

  • 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
Mọi người cho mình hỏi là tại sao mã dxf 0 mình đọc help thấy ghi là entity type, vậy thì tại sao block lại là "insert" như bạn pfievxd trên kia viết, và polyline có phải là (cons 0 "polyline") không? Xin lỗi nếu câu hỏi của mình là gà.

Hê hề hề,

Tại vì Cad nó bảo thế mà lị. Tất cả các block, kể cả block thuộc tính đều có entity type là insert bạn ạ. Còn các polyline thì có entity type là Polyline. Cái bạn viết (cons 0 "polyline") sẽ trả về một dot pair list là '(0 . "polyline") bạn ạ.

Muốn biết rõ hơn, bạn chịu khó tìm hiểu thêm trong help developer của CAD bạn nhé.

Hề hề hề...

  • 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
Hê hề hề,

Tại vì Cad nó bảo thế mà lị. Tất cả các block, kể cả block thuộc tính đều có entity type là insert bạn ạ. Còn các polyline thì có entity type là Polyline. Cái bạn viết (cons 0 "polyline") sẽ trả về một dot pair list là '(0 . "polyline") bạn ạ.

Muốn biết rõ hơn, bạn chịu khó tìm hiểu thêm trong help developer của CAD bạn nhé.

Hề hề hề...

Hê hê Bác Bình già nên lẫn rồi đường polyline entity type là LWPOLYLINE.

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
Hê hê Bác Bình già nên lẫn rồi đường polyline entity type là LWPOLYLINE.

Chớ vội cười. Không phải Bác Bình lẫn, mà kiến thức của bạn chưa đủ.

Có 2 loại đường Pline

- Polyline (loại này lại được chia thành 2 loại 2D và 3D) là loại đường pline kiểu cũ, được tạo ra bởi các bản cad đời thấp.

- LWpolyline (loại này mình chưa biết có chia thành 2 loại như trên không vì chưa kiểm tra) Có lẽ do cách mô tả record đối tượng của pline loại cũ gặp 1 số hạn chế khi sử dụng nên các bản cad đời mới đưa ra loại pline mới này. nhưng đồng thời vẫn hỗ trợ loại pline kiểu cũ. ta không thể tạo ra Polyline bằng cách vẽ bằng lệnh PL mà chỉ có thể vẽ được LWPolyline trên các bản cad đời cao. có lẽ Bác Bình không sử dụng các bản cad đời mới nên không bít cái này. Tuy vậy ta vẫn có thể tạo Polyline kiểu cũ bằng hàm entmake trên các bản cad đời mới.

  • 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
Hê hê Bác Bình già nên lẫn rồi đường polyline entity type là LWPOLYLINE.

:undecided: Bạn trẻ quá nên không biết là có loại đường polyline entity type là POLYLINE

Bạn Xem cái này : đường polyline entity type là POLYLINE

  • 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
Bạn trẻ quá nên không biết là có loại đường polyline entity type là POLYLINE

Bạn Xem cái này : đường polyline entity type là POLYLINE

Hê hê đúng là mình trẻ người non dạ mong các Bác bỏ qua cho. Hì hì cám ơn bác giúp em mở rộng tầm mắt. Quả thực là em chưa dùng thằng 2D polyline này bao giờ. Để vẽ nó thì dùng lệnh gì vậy Bác mà thằng POLYLINE này khác thằng LWPOLYLINE ở điểm gì vậy bác có thể cho em biết đưộc không???

  • 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
Hê hê đúng là mình trẻ người non dạ mong các Bác bỏ qua cho. Hì hì cám ơn bác giúp em mở rộng tầm mắt. Quả thực là em chưa dùng thằng 2D polyline này bao giờ. Để vẽ nó thì dùng lệnh gì vậy Bác mà thằng POLYLINE này khác thằng LWPOLYLINE ở điểm gì vậy bác có thể cho em biết đưộc không???

Hề hề hề,

Quả thật là mình cũng chả phân biệt được cũ với mới như các bác đã phân tích đâu, chỉ biết rằng có hai cách quản lý thằng polyline này mà thôi. Một kiểu chắc là cũ như ThaiStreetsz đã nói, là kiểu coi polyline như một tổ hợp của các đối tượng đơn là các vertex và phân đoạn polyline, còn cách khác là coi polyline như một đối tượng đơn bao gồm đầy đủ các vertex và các đặc tính khác .

Hai cách này về bản chất thì cũng giống nhau nhưng cách thứ hai thì thuận tiện cho việc truy xuất các thuộc tính của polyline hơn.

Ở cách trước để truy xuất các thuộc tính của polyline thì phải sử dụng hàm entnext để mò tới từng đối tượng có trong nó. Khi đó trong mà dxf của polyline có thêm mã 66.

Tại sao như vậy thì là tại thằng Cad nó nghĩ ra thế, mình chỉ biết xài mà chả biết tại sao cả. Hề hề hề...

  • 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

Mọi người cho mình hỏi. Mình đang dùng Cad 2007, khi cài lisp catdim thì thấy báo lỗi: "Unhandled Access Violation Writting 0x0014 Exception at 76f0fc47h", nhưng cài vào Cad 2004 thì vẫn dùng được. Mình cài thử trimdim hay cutdim cũng ra lỗi như vậy. Giúp mình với.

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

×