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

Viết lisp theo yêu cầu [phần 2]

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

Mình thấy bạn cũng giống như bạn phamthanhbinh cách đây vài năm là

mặc dù chưa biết nhiều về lisp nhưng vẫn tích cực viết chương trình.

Mặc dù bạn Tue_NV đã viết rồi nhưng mình cũng sửa lại code của bạn với vài góp ý sau:

- Vẽ ARC có nhiều cách, ta tìm cách nào dễ tính toán là được. Trong lisp này mình chọn (Start, End, Direction)

- Cho hẳn điểm P1 nằm trên đường thứ nhất, P2 nằm trên đường thứ hai thì sẽ bớt nhiều phép so sánh.

- Hạn chế dùng biến GLOBAL, chỉ dùng khi cần thiết.

Các dòng comment là code đầy đủ của tính toán P1&P2 , bạn xem sẽ thấy dễ hiểu hơn

(defun c:ptt ( / ss pg1 pg2 pg3 pg4 p1 p2 giao d om)	
(setq ss (ssget '((0 . "line")))
			pg1 (cdr (assoc 10 (entget (ssname ss 0))))
			pg2 (cdr (assoc 11 (entget (ssname ss 0))))
			pg3 (cdr (assoc 10 (entget (ssname ss 1))))
			pg4 (cdr (assoc 11 (entget (ssname ss 1))))
			p1 (getpoint "\nchon diem tiep xuc thu nhat:")
			giao (inters pg1 pg2 pg3 pg4 nil)
			d (distance giao p1)
			om (getvar "osmode")
			)
(setvar "osmode" 0)
;;;....	
(setq p1 (polar giao (angle giao (if (equal giao pg1 1.e-8)pg2 pg1)) d))
(setq p2 (polar giao (angle giao (if (equal giao pg3 1.e-8)pg4 pg3)) d))

(command "arc" p1 "e" p2 "d" giao)
(setvar "osmode" om)
)

Dòng này hơi bị dư ?

(setq p1 (polar giao (angle giao (if (equal giao pg1 1.e-8)pg2 pg1)) d))

Điểm p1 là số liệu đầu vào.

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
Dòng này hơi bị dư ?

(setq p1 (polar giao (angle giao (if (equal giao pg1 1.e-8)pg2 pg1)) d))

Điểm p1 là số liệu đầu vào.

Dòng đó không bị dư đâu vì nếu không thì tìm P2 lại phêm 1 phép so sánh để chọn đường thẳng còn lại.

Ngược lại nó còn fix lỗi khi chọn điểm P1 không trùng hoàn toàn trên 1 trong 2 đường thẳng nữa

Đúng là mình tìm ra lỗi rồi với hàm equal thì phải cho tham số chính xác nếu không có thì nhiều trường hợp sẽ báo nil

code này đã sửa rồi và test thấy đúng không biết chạy trên máy kác thì thế nào. Cám ơn bạn đã giúp mình nhưng nhờ gợi ý của bác Tue_VN mà mình đã tìm ra rôi. Vì mình không được học cad từ cơ bản nên mới thế này đây

Bạn thử lại khi trong bản vẽ có OSMODE khác 0 xem

Chào bạn Truongthanh,

Sở dĩ cái kết quả cửa lisp do mình viết khác với cái kết quả mà bạn làm bằng Excel là do thằng cu này đây:

"Ø800 - L120- i1.25"

Do cấu trúc text của bạn bị sai (thiếu một khoảng trắng giữa các ký tự chỉ chiều dài và dấu gạch ngang) nên lisp nó đọc kết quả bị sai. Thay vì phải là 120 thì nó chỉ đọc được là 12.

Vì thế nên hai kết quả chênh lệch nhau đúng 108 đơn vị bạn ạ.

Còn cái vụ tại sao bạn chạy lisp thì nó lại vẽ thiếu đường line thì mình đoán là do các biến hễ thống của bạn mà thôi. Bởi vì mình chạy thì nó vẫn ra kết quả ngon lành. Bạn xem đây, không phải chỉ một lần chạy mà chạy rất nhiều lần . Có khác chăng chỉ là cái text nó không ra tiếng Việt là do nó sử dụng style khác mà thôi.

http://www.cadviet.com/upfiles/3/truongthanh.jpg

 

Mình sẽ kiểm tra lại cái style này để cho nó hiển thị đúng.

 

Và đây là cái kết quả chạy ra sau khi mình đã sửa cái text sai của bạn cho đúng cấu trúc như mình đã mô tả ở bài trước.

 

Trang upload của diễn đàn trục trặc nên mình không upload ảnh cho bạn thấy được. Mình sẽ upload sau vậy. Bạn cứ thử sửa lại cái text đó và chạy lại xem nhé.

Bạn dùng hàm vl-string-subst để loại bớt các ký tự Ø,L,i và dấu cách trong "Ø800 - L120- i1.25"

sau đó dùng hàm (setq ls (ACET-STR-TO-LIST "-" string)) là sẽ được 1 list (800 120 1.25) mà không cần biết là 3 hay 4 chữ số

  • 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
Dòng đó không bị dư đâu vì nếu không thì tìm P2 lại phêm 1 phép so sánh để chọn đường thẳng còn lại.

Ngược lại nó còn fix lỗi khi chọn điểm P1 không trùng hoàn toàn trên 1 trong 2 đường thẳng nữa

.....................

Bác giải thích chưa thuyết phục ! (câu này mới "mót" được)

- "1 phép so sánh" so với 4 lệnh của đoạn (polar giao (angle giao (if (equal giao pg1 1.e-8)pg2 pg1)) d) chắc là lớn hơn ?

 

- "khi chọn điểm P1 không trùng hoàn toàn trên 1 trong 2 đường thẳng" thì dòng tính khoảng cách "(distance giao p1)" (dùng để tính p1 và p2) cho sai số là bao nhiêu ?

  • 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ác giải thích chưa thuyết phục ! (câu này mới "mót" được)

- "1 phép so sánh" so với 4 lệnh của đoạn (polar giao (angle giao (if (equal giao pg1 1.e-8)pg2 pg1)) d) chắc là lớn hơn ?

 

- "khi chọn điểm P1 không trùng hoàn toàn trên 1 trong 2 đường thẳng" thì dòng tính khoảng cách "(distance giao p1)" (dùng để tính p1 và p2) cho sai số là bao nhiêu ?

Nếu không gán P1 thì code sẽ là

(setq ang1 (angle giao (if (equal giao pg1 1.e-8) pg2 pg1)))

(setq ang2 (angle giao (if (equal giao pg3 1.e-8) pg4 pg3)))

(setq p2 (polar giao (if (equal (angle giao p1) ang1 1.e-8) ang2 ang1) d))

 

So sánh thì cách đầu nhiều hơn 1 lệnh polar nhưng ít hơn 1 lệnh angle, ít hơn 1 phép so sánh

Sai số là (1-cos), là 1 vô cùng bé bậc 2 của góc lệch của (giao P1) và đường thẳng.

PS: Mình viết code này và post lên rồi mới thấy là cách làm cũng giống như của bạn Tue_NV

là không dùng điểm P1 và cách vẽ ARC, còn đố vui thì mình cũng chưa đọc

  • 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
Dòng đó không bị dư đâu vì nếu không thì tìm P2 lại phêm 1 phép so sánh để chọn đường thẳng còn lại.

Ngược lại nó còn fix lỗi khi chọn điểm P1 không trùng hoàn toàn trên 1 trong 2 đường thẳng nữa

 

Bạn thử lại khi trong bản vẽ có OSMODE khác 0 xem

 

Bạn dùng hàm vl-string-subst để loại bớt các ký tự Ø,L,i và dấu cách trong "Ø800 - L120- i1.25"

sau đó dùng hàm (setq ls (ACET-STR-TO-LIST "-" string)) là sẽ được 1 list (800 120 1.25) mà không cần biết là 3 hay 4 chữ số

Chào các bác,

Với góp ý của bác ndtnv, mình lọ mọ đọc lại các hàm vl-string-?????? và liều mạng làm thử lại cái lisp đã gửi bạn Truongthanh thì thấy ra được cái lisp mới như sau:

(defun c:tktxt ( / ss n i tnlst cnlst tn cn)
(vl-load-com)
(setq ss (ssget (list (cons 0 "text")))
        n  (sslength ss)
        i 0
       tnlst (list)
       cnlst (list)
)
(while (        (setq en (ssname ss i)
               els (entget en)
               txt (cdr (assoc 1 els))
       )
       (if  (= (substr txt 1 1) (chr 216))
            (if (wcmatch txt "*-*-*")
               (setq tnlst (append tnlst (list txt)))
               (setq cnlst (append cnlst (list txt)))
            )
        )
        (setq i (1+ i))
)
(setq cn (strcase (getstring "\n Ban muon thong ke duong ong cap nuoc (y or n): ")))
(if (= cn "Y")
(progn
(chst "1")
(setq pt (getpoint "\n Chon diem dat bang" ))
(setq prtxt "\\U+1ED0NG NH\\U+1EF0A uPVC ")
(crtbl pt)
(seplst cnlst pt)
)
)
(setq tn (strcase (getstring "\n Ban muon thong ke duong ong thoat nuoc (y or n): ")))
(if (= tn "Y")
(progn
(chst "1")
(setq pt (getpoint "\n Chon diem dat bang" ))
(setq prtxt "C\\U+1ED0NG BTCT ")
(crtbl pt)
(seplst tnlst pt)
)
)

)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun seplst ( lst p1 / lst1 lst2 lst3 tdd lo p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 cnt )
(setq cnt 0)
(while (/= lst nil)
       (setq chuoi (car (txtfil (nth 0 lst)))
                lst1 (cdr lst)
                lst2 nil
                tdd 0
                lst2 (append lst2 (list (nth 0 lst)))
       )
       (foreach b lst1
                (if (= (car (txtfil b )) chuoi)
                    (setq lst2 (append lst2 (list b )))
                    (setq lst3 (append lst3 (list b )))
                )
       )
       (foreach c lst2
               (setq tdd (+  tdd (atof (cadr (txtfil c))))
                       lo (car (txtfil c ))
               )
       )
      (alert (strcat "\n Tong do dai ong " lo " la " (rtos tdd 2  ) ))
       (setq lst lst3
               lst3 nil 
               cnt (1+ cnt)
       )
      (setq p2 (polar p1 (- (/ pi 2)) (* cnt 5))
       p3 (polar p2 0 8)
       p4 (polar p3 0 44)
       p5 (polar p4 0 20)
       p6 (polar p5 0 13)
       p7 (polar p2 (- (/ pi 2)) 5)
       p8 (polar p3 (- (/ pi 2)) 5)
       p9 (polar p4 (- (/ pi 2)) 5)
       p10 (polar p5 (- (/ pi 2)) 5)
       p11 (polar p6 (- (/ pi 2)) 5)
)       
(entmake (list (cons 0 "TEXT") (cons 40 2) (cons 50 0) (cons 10 (list (+ (car p7) 2) (+ (cadr p7) 1) )) 
(cons 1 (rtos cnt 2 0))  (cons 8 "ahs-tnt-text") (cons 7 "1")  )  )  
(entmake (list (cons 0 "TEXT") (cons 40 2) (cons 50 0) (cons 10 (list (+ (car p8) 2) (+ (cadr p7) 1) )) 
(cons 1 (strcat prtxt lo)) (cons 8 "ahs-tnt-text") (cons 7 "1") )  )         
(entmake (list (cons 0 "TEXT") (cons 40 2) (cons 50 0) (cons 10 (list (+ (car p9) 4) (+ (cadr p7) 1) )) 
(cons 1 (rtos tdd 2 0)) (cons 8 "ahs-tnt-text") (cons 7 "1")  )  )  
(entmake (list (cons 0 "TEXT") (cons 40 2) (cons 50 0) (cons 10 (list (+ (car p10) 5) (+ (cadr p7) 1) )) 
(cons 1 "m") (cons 8 "ahs-tnt-text") (cons 7 "1")  )  ) 
(command "pline" p2 p7 p11 p6 "")
(command "pline" p3 p8 "")
(command "pline" p4 p9 "")
(command "pline" p5 p10 "")       
)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun crtbl ( p1 / p2 p3 p4 p5 p6 p7 p8 p9 p10 p11)
(setq p2 (list (+ (car p1) 12.5) (+ (cadr p1) 2))
       p3 (polar p1 0 8)
       p4 (polar p3 0 44)
       p5 (polar p4 0 20)
       p6 (polar p5 0 13)
       p7 (polar p1 (- (/ pi 2)) 5)
       p8 (polar p3 (- (/ pi 2)) 5)
       p9 (polar p4 (- (/ pi 2)) 5)
       p10 (polar p5 (- (/ pi 2)) 5)
       p11 (polar p6 (- (/ pi 2)) 5)
)
(entmake (list (cons 0 "TEXT") (cons 40 3) (cons 50 0) (cons 10 p2)  
(cons 1 "%%UB\\U+1EA2NG T\\U+1ED4NG H\\U+1EE2P KH\\U+1ED0I L\\U+01AF\\U+1EE2NG")
(cons 8 "ahs-tnt-text") (cons 7 "1")  )  )         
(entmake (list (cons 0 "TEXT") (cons 40 2) (cons 50 0) (cons 10 (list (+ (car p7) 2) (+ (cadr p7) 1) )) 
(cons 1 "TT")  (cons 8 "ahs-tnt-text") (cons 7 "1")  )  )  
(entmake (list (cons 0 "TEXT") (cons 40 2) (cons 50 0) (cons 10 (list (+ (car p8) 14) (+ (cadr p7) 1) )) 
(cons 1 "H\\U+1EA0NG M\\U+1EE4C") (cons 8 "ahs-tnt-text") (cons 7 "1")  )  )         
(entmake (list (cons 0 "TEXT") (cons 40 2) (cons 50 0) (cons 10 (list (+ (car p9) 1) (+ (cadr p7) 1) )) 
(cons 1 "KH\\U+1ED0I L\\U+01AF\\U+1EE2NG") (cons 8 "ahs-tnt-text") (cons 7 "1")  )  )  
(entmake (list (cons 0 "TEXT") (cons 40 2) (cons 50 0) (cons 10 (list (+ (car p10) 2) (+ (cadr p7) 1) )) 
(cons 1 "\\U+0110\\U+01A0N V\\U+1ECA") (cons 8 "ahs-tnt-text") (cons 7 "1")  )  ) 
(command "pline" p1 p6 p11 p7 p1 "")
(command "pline" p3 p8 "")
(command "pline" p4 p9 "")
(command "pline" p5 p10 "")

)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun txtfil ( txt / n i)

(setq ;;;;;;;;;;;;;;;;;;;;;;;;;; txt (cdr(assoc 1 (entget(car(entsel)))))
       n (strlen txt) 
       i 1
)
(while (       (setq a (substr txt i 1))
      (if (or (= a "L") (= a "i") (= a " "))
         (progn
                (setq txt (vl-string-subst "" a txt)
                        i (1- i)
                        n (1- n)
                )
          )
       )
       (setq i (1+ i))
)
(setq txt (acet-str-to-list "-" txt))
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;        

(defun chst (name )
;;;;;;;;(setq name (getstring t "\n Nhap ten style: "))
(if (= (tblsearch "style" name) nil)
   (command "style" name "arial" "" 0.8 "" "" "" )
)
)                    

 

Về cơ bản vẫn cho ra kết quả giống hệt cái lisp cũ và khi mình xài cái hàm testtime của bác Giabach để test thử tốc độ chạy của hai cái lisp cũ và mới thì thấy kết quả cũng gần gần như nhau nếu bỏ qua sai số do người thao tác (tốc độ pick chuột ấy mà).

Vậy nên việc dùng cái nào thì tùy bác Truongthanh lựa chọn. Tuy nhiên cái lisp thứ hai này có vẻ như oai hơn vì nó có xài mấy thằng vl-?????. Hề hề hề.

Thế là cũng vọc thêm được một tí về các hàm vl-string-???? , cho dù chưa kỹ lắm nhưng cũng đã biết xài. Hề hề hề ..... Khoái, khoái, khoái........

 

PS: Cái lisp thứ hai này thì nó chạy chấp luôn cả cái lỗi nhập thiếu khoảng trắng trong text của bạn truongthanh như trường hợp vừa rồi bạn ạ. Hề hề hề. Chỉ cần bạn nhập đúng các ký tự đường kính và chiều dài cũng như gạch nối và ký tự độ dốc.

Tuy nhiên dù dùng lisp nào thì bạn cũng vẫn nên nhập text cho chuẩn mực vì như vậy bản vẽ mới đẹp và thống nhất bạn ạ. Và nó còn OAI nữa, hề hề hề.....

  • 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
Cái này đơn giản nhất quả đất.

Gõ lệnh scale chọn đoạn thẳng chọn điểm gốc xong gõ 2000/1590 để được đoạn 2000 hoặc 1000/1590 để được đoạn 1000. Chúc bạn vui.

 

E hiểu ý anh, nhưng mà khổ cái là đoạn thẳng đó e ko biết kích thước chính xác, do vậy phải đo, rồi mới scal, rồi xóa cái dim mới đo xong đi, hic, nhiều công đoạn quá.

 

Em thấy nếu có lisp thí nhanh 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
Nếu có nhiều đoạn thẳng cần thay đổi như vậy thì nên sử dụng lệnh Len

 

Hic,em làm thử sao mà kkhông được.

Mong anh giúp em cái lệnh Len

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
E hiểu ý anh, nhưng mà khổ cái là đoạn thẳng đó e ko biết kích thước chính xác, do vậy phải đo, rồi mới scal, rồi xóa cái dim mới đo xong đi, hic, nhiều công đoạn quá.

 

Em thấy nếu có lisp thí nhanh hơn.

Của bạn đây. Bạn có thể chọn nhiều đường line cuòng một lúc. Chú ý các đường line này lấy gốc là điểm bắt đầu vẽ line

(defun c:keol ()
(setq ss (ssget '((0 . "line")))
i 0
kt (getreal "\nnhap kich thuoc moi: ")
)
(while (< i (sslength ss))
(setq p1 (cdr (assoc 10 (entget (ssname ss i))))
p2 (cdr (assoc 11 (entget (ssname ss i))))
pm (polar p1 (angle p1 p2) kt)
)
(entmod (subst (cons 11 pm) (cons 11 p2) (entget (ssname ss i))))
(setq i (1+ 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
Hic,em làm thử sao mà kkhông được.

Mong anh giúp em cái lệnh Len

Bạn làm như sau :

Command: len

LENGTHEN

Select an object or [DElta/Percent/Total/DYnamic]: T -> Gõ T

 

Specify total length or [Angle] : 500 -> Gõ chiều dài (ví dụ 500)

 

Select an object to change or [undo]: -> Kích vào đầu mút của LINE hoặc PLINE

Select an object to change or [undo]: -> Kích vào đầu mút của LINE hoặc PLINE tiếp theo

Select an object to change or [undo]:.......

................................................................................

.........

Tùy chọn Undo để hoàn trả lại chiều dài của LINE hoặc PLINE mà bạn đã pick

 

-> CAD sẽ tính chiều dài = 500 (điểm gốc của mút tính từ.....Bạn làm xong sẽ biết ha)

Chúc thành công

  • 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

Xin chào các anh chị em!

Hôm nay em muốn nhờ viết một lisp như sau:

Bản vẽ em nhận được (bản vẽ chi tiết phường Đằng Lâm - quận Hải An - thành phố Hải Phòng) không hiểu vì sao xuất hiện rất nhiều text có cùng nội dung "UBND" và "phường Đằng Lâm" như hình minh họa sau:

 

ubnd.jpg

 

Để minh chứng cho điều này, em đã tạo một block có tên là "tron100", hình tròn hatch ANSI31 màu xanh bao quanh một số text mà em tìm thấy, như hình minh họa sau:

 

ubnd1.jpg

 

Có thể tìm thấy các block này bằng lệnh fi. Nhưng em không thể tìm thấy tất cả các text này bằng thủ công hay bằng lệnh fi (để xóa đi)

Vậy có cách nào tìm các đối tượng theo 2 điều kiện của cả text "UBND" và text "phường Đằng Lâm" (dùng lệnh fi cho cả 2 text này không được).

Xin gửi kèm file mô tả

Nhờ mọi người giải đáp giùm! Xin chân thành 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
Xin chào các anh chị em!

Hôm nay em muốn nhờ viết một lisp như sau:

 

Có thể tìm thấy các block này bằng lệnh fi. Nhưng em không thể tìm thấy tất cả các text này bằng thủ công hay bằng lệnh fi (để xóa đi)

Vậy có cách nào tìm các đối tượng theo 2 điều kiện của cả text "UBND" và text "phường Đằng Lâm" (dùng lệnh fi cho cả 2 text này không được).

Xin gửi kèm file mô tả

Nhờ mọi người giải đáp giùm! Xin chân thành cảm ơn!

 

Tôi đã thử fie của bạn!

Dùng lệnh chọn Similar và Quick Select có 216 đối tượng Text "Phường Đằng Lâm" và 211 Text "UBND"

Lọc được thì xoá được

  • 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
Xin chào các anh chị em!

Hôm nay em muốn nhờ viết một lisp như sau:

Bản vẽ em nhận được (bản vẽ chi tiết phường Đằng Lâm - quận Hải An - thành phố Hải Phòng) không hiểu vì sao xuất hiện rất nhiều text có cùng nội dung "UBND" và "phường Đằng Lâm" như hình minh họa sau:

 

ubnd.jpg

 

Để minh chứng cho điều này, em đã tạo một block có tên là "tron100", hình tròn hatch ANSI31 màu xanh bao quanh một số text mà em tìm thấy, như hình minh họa sau:

 

ubnd1.jpg

 

Có thể tìm thấy các block này bằng lệnh fi. Nhưng em không thể tìm thấy tất cả các text này bằng thủ công hay bằng lệnh fi (để xóa đi)

Vậy có cách nào tìm các đối tượng theo 2 điều kiện của cả text "UBND" và text "phường Đằng Lâm" (dùng lệnh fi cho cả 2 text này không được).

Xin gửi kèm file mô tả

Nhờ mọi người giải đáp giùm! Xin chân thành cảm ơn!

Anh cũng không thấy có vấn đề gì cả svba à? Filter chọn vẫn được, Erase vẫn ngon lành..

Nếu muốn chọn text "UBND" và text "phường Đằng Lâm" cùng 1 lúc thì dùng lệnh Filter (**Begin Or ..... ** End or

Trường hợp của em chọn không được có phải là giống như 1 lần trước đây, em gửi 1 file cho anh và nói rằng file đó không làm gì với Text được? Không sử dụng bất kì lệnh hiệu chỉnh nào đối với Text? Có phải như vậy 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
Tôi đã thử fie của bạn!

Dùng lệnh chọn Similar và Quick Select có 216 đối tượng Text "Phường Đằng Lâm" và 211 Text "UBND"

Lọc được thì xoá được

 

Cảm ơn anh trinhvqh! Em không muốn chọn 216 text "Phường Đằng Lâm" và 211 text "UBND". Em muốn chọn tất cả các cặp text gồm "Phường Đằng Lâm" và "UBND".

Rất cảm ơn anh đã giúp đỡ

 

Anh cũng không thấy có vấn đề gì cả svba à? Filter chọn vẫn được, Erase vẫn ngon lành..

Nếu muốn chọn text "UBND" và text "phường Đằng Lâm" cùng 1 lúc thì dùng lệnh Filter (**Begin Or ..... ** End or

Trường hợp của em chọn không được có phải là giống như 1 lần trước đây, em gửi 1 file cho anh và nói rằng file đó không làm gì với Text được? Không sử dụng bất kì lệnh hiệu chỉnh nào đối với Text? Có phải như vậy không?

 

Cảm ơn anh Tue_NV! Lần này thì em "làm gì" được với Text. Nhưng cái món "**Begin Or ..... ** End or" thì em chưa biết bao giờ, anh có thể chỉ cho em được khô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
......... Em muốn chọn tất cả các cặp text gồm "Phường Đằng Lâm" và "UBND".

Rất cảm ơn anh đã giúp đỡ

Cảm ơn anh Tue_NV! Lần này thì em "làm gì" được với Text. Nhưng cái món "**Begin Or ..... ** End or" thì em chưa biết bao giờ, anh có thể chỉ cho em được không?

Em theo dõi hình vẽ này.

filter.jpg

Anh tin em sẽ làm được

Chúc thành công :(

 

Em chú ý rằng filter với cách như trên : là chọn không phải theo cặp như em mong muốn đâu nhé. Em thử là biết liền

Nếu muốn chọn theo cặp -> chỉ có thể dùng Lisp mà thôi. Hơi bị khó vì các Text của em sắp xếp không theo 1 quy luật nào 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

Mình có phần hatch của 1 đa giác (đa giác trước đó đã bị xóa) , nhờ các bạn giúp mình viết lisp ghi ra tọa độ đỉnh của đa giác (theo thứ tự tạo thành đa giác) . VD: hình chữ nhật được tạo thành bởi A B C D => thự tự là A B C D hoặc B C D A .. không thể là A C B D

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ó phần hatch của 1 đa giác (đa giác trước đó đã bị xóa) , nhờ các bạn giúp mình viết lisp ghi ra tọa độ đỉnh của đa giác (theo thứ tự tạo thành đa giác) . VD: hình chữ nhật được tạo thành bởi A B C D => thự tự là A B C D hoặc B C D A .. không thể là A C B D

Bạn sang đây xem thử

http://www.cadviet.com/forum/index.php?showtopic=18&st=0

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ó phần hatch của 1 đa giác (đa giác trước đó đã bị xóa) , nhờ các bạn giúp mình viết lisp ghi ra tọa độ đỉnh của đa giác (theo thứ tự tạo thành đa giác) . VD: hình chữ nhật được tạo thành bởi A B C D => thự tự là A B C D hoặc B C D A .. không thể là A C B D

Hatch mà muốn có lại biên của nó thì. kích 2 phát vài nó ra cái bảng hatch edit chọn vào mục Recreate boundary là có lại biên. Còn lisp lấy tọa độ dỉnh pline thì quá trời trên caviet đấy.

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
Hatch mà muốn có lại biên của nó thì. kích 2 phát vài nó ra cái bảng hatch edit chọn vào mục Recreate boundary là có lại biên. Còn lisp lấy tọa độ dỉnh pline thì quá trời trên caviet đấy.

Nhưng mờ ý của bạn hdt4151 như thế này cơ :

http://www.cadviet.com/forum/index.php?showtopic=25233

@ hdt4151

1. Bạn nên rút kinh nghiệm không nên post 1 chủ đề ở 2 topic khác nhau

2. Bạn nên minh hoạ rõ hơn kết quả bạn cần xuất. Chẳng hiểu mô tê gì cả. Không biết được kết quả cuối cùng bạn muốn là gì? Bạn minh hoạ cụ thể qua file .dwg nhé

  • 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

Những việc như bạn nói trên thì hoàn toàn phải dùng tay, ở đây mình muốn gói gọn thành 1 lisp , chỉ cần chọn hatch => xuất ra toạ độ điểm theo thứ tự tạo thành đa giác. Mình có gần 50 cái hatch như vậy !

 

Thực ra mục đích chính của mình là pick 1 điểm vào giữa khối đa giác có sẵn (tạo thành bởi line, ko phải polyline)=> tạo thành 1 boundary của khối đa giác đó => xuất ra theo thứ tự tọa độ của đỉnh đa giác. Nếu bạn giúp được mình thì tốt quá :(

 

Đây là hình mình họa:

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

 

Kết quả cần xuất là tọa độ X,Y đỉnh của đa giác (xuất ra trực tiếp, ra file text text thì càng tốt)

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
Thực ra mục đích chính của mình là pick 1 điểm vào giữa khối đa giác có sẵn (tạo thành bởi line, ko phải polyline)=> tạo thành 1 boundary của khối đa giác đó => xuất ra theo thứ tự tọa độ của đỉnh đa giác. Nếu bạn giúp được mình thì tốt quá :(

 

Đây là hình mình họa:

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

 

Kết quả cần xuất là tọa độ X,Y đỉnh của đa giác (xuất ra trực tiếp, ra file text text thì càng tốt)

Cái này mình làm theo đúng ý của bạn. Nó xuất toạ độ các đỉnh ra file txt trong cùng thư mục và cùng tên với bản vẽ đang mở.

;; free lisp from cadviet.com
(defun c:tdd ( / tmp dlst p1 file opw msg id)
(setq dlst (list(strcat "X" "\t" "Y" "\t" "Z" "\n"))
oldos (getvar "osmode")
file (strcat (getvar "DWGPREFIX") (substr (getvar "DWGNAME") 1 (- (strlen (getvar "DWGNAME")) 4)) ".txt")
p (getpoint "\nChon diem nam trong da giac:")
i 0)
(setvar "osmode" 0)
(command "boundary" p "")
(setq name (entlast))
(while (/= (vlax-curve-getPointAtParam (vlax-ename->vla-object name) (1+ i)) nil)
(setq p1 (vlax-curve-getPointAtParam (vlax-ename->vla-object name) i)
dlst (append (list (strcat (rtos (car p1) 2 3)
"\t"
(rtos (cadr p1) 2 3)
"\t"
(rtos (caddr p1) 2 3)
)
)
dlst)
)
(setq i (1+ i))
)
(setq dlst (reverse dlst))
(setq ;file "d:\\tien\\diem.txt"
opw (open file "w")
)
(foreach n dlst (write-line n opw))
(close opw)
(setvar "osmode" oldos)
)
)

  • 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
Những việc như bạn nói trên thì hoàn toàn phải dùng tay, ở đây mình muốn gói gọn thành 1 lisp , chỉ cần chọn hatch => xuất ra toạ độ điểm theo thứ tự tạo thành đa giác. Mình có gần 50 cái hatch như vậy !

 

Thực ra mục đích chính của mình là pick 1 điểm vào giữa khối đa giác có sẵn (tạo thành bởi line, ko phải polyline)=> tạo thành 1 boundary của khối đa giác đó => xuất ra theo thứ tự tọa độ của đỉnh đa giác. Nếu bạn giúp được mình thì tốt quá :(

 

Đây là hình mình họa:

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

 

Kết quả cần xuất là tọa độ X,Y đỉnh của đa giác (xuất ra trực tiếp, ra file text text thì càng tốt)

Thực ra thực ra cái con khỉ ấy ông nhá cái mục đích chính và cái ông hỏi chả có liên quan chi 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

Thanks bạn !! Nhờ bạn chút nữa được ko: không cần ghi tọa độ Z, xóa đi cái buondary sau khi đã hoàn tất, dùng notepad mở file đó :(

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
Xin chào các anh chị em!

Hôm nay em muốn nhờ viết một lisp như sau:

Bản vẽ em nhận được (bản vẽ chi tiết phường Đằng Lâm - quận Hải An - thành phố Hải Phòng) không hiểu vì sao xuất hiện rất nhiều text có cùng nội dung "UBND" và "phường Đằng Lâm" như hình minh họa sau:

 

ubnd.jpg

.................

Vậy có cách nào tìm các đối tượng theo 2 điều kiện của cả text "UBND" và text "phường Đằng Lâm" (dùng lệnh fi cho cả 2 text này không được).

Xin gửi kèm file mô tả

Nhờ mọi người giải đáp giùm! Xin chân thành cảm ơn!

Chào svba1608

Bạn thử chạy LISP filterTxt .

Kết quả sẽ lọc các cặp TEXT "UBND" và "Phường Đằng Lâm" ra Layer có tên LayerFilter.

(defun c:filterTxt (/ ent ent1 i p1 p2 ss ss1 text1 text2)
 (if (not(tblsearch "layer" "LayerFilter") )    
   (command "-layer" "n" "LayerFilter" "") )
 (setq	text1 "UBND"
text2 "Ph??ng §?ng L?m")  
 (setq	ss (ssget (list '(0 . "Text") (cons 1 text1) (cons 8 "TT_CHU") (cons 40 0.7)))
i -1 )
 (while (setq ent (ssname ss (setq i (1+ i))))
   (setq p1 (cdr (assoc 10 (entget ent)))
  p2 (polar p1 -1.4 1.6))
   (if (and
  (setq ss1 (ssget "c" p1 p2 (list(cons 0  "Text") (cons 1 text2) (cons 8 "TT_CHU") (cons 40 0.7))))
  (=(sslength ss1) 1))
     (progn
(setq ent1 (ssname ss1 0))
(entmod (subst (cons 8 "LayerFilter") (assoc 8 (entget ent)) (entget ent)))
(entmod (subst (cons 8 "LayerFilter") (assoc 8 (entget ent1)) (entget ent1)))	)  ))
 (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
Cái này mình làm theo đúng ý của bạn. Nó xuất toạ độ các đỉnh ra file txt trong cùng thư mục và cùng tên với bản vẽ đang mở.

;; free lisp from cadviet.com
(defun c:tdd ( / tmp dlst p1 file opw msg id)
(setq dlst (list(strcat "X" "\t" "Y" "\t" "Z" "\n"))
oldos (getvar "osmode")
file (strcat (getvar "DWGPREFIX") (substr (getvar "DWGNAME") 1 (- (strlen (getvar "DWGNAME")) 4)) ".txt")
p (getpoint "\nChon diem nam trong da giac:")
i 0)
(setvar "osmode" 0)
(command "boundary" p "")
(setq name (entlast))
(while (/= (vlax-curve-getPointAtParam (vlax-ename->vla-object name) (1+ i)) nil)
(setq p1 (vlax-curve-getPointAtParam (vlax-ename->vla-object name) i)
dlst (append (list (strcat (rtos (car p1) 2 3)
"\t"
(rtos (cadr p1) 2 3)
"\t"
(rtos (caddr p1) 2 3)
)
)
dlst)
)
(setq i (1+ i))
)
(setq dlst (reverse dlst))
(setq ;file "d:\\tien\\diem.txt"
opw (open file "w")
)
(foreach n dlst (write-line n opw))
(close opw)
(setvar "osmode" oldos)
)
)

 

 

Bạn ơi khi mình dùng lệnh UCS chuyển tọa độ 0,0 về 1 điểm mới thì chạy lisp không ra được kết quả đúng, nó chỉ trả về tọa độ ứng với điểm 0,0 ban đầu. Bạn kiểm tra lại giúp mình nhé.

 

Bạn viết lại lisp theo cấu trúc này được không:

- Pick vào 1 điểm => tạo boundary => xuất ra tọa độ vào file text. (Không cần ghi tọa độ Z) => xóa boundary vừa tạo.

- Thông báo lựa chọn tiếp tục hay dừng Y/N , mặc định là Y

- Nhấn Enter để tiếp tục pick tiếp => xuất ra vào text đã có sẵn trên, dữ liệu ghi thêm vào phía dưới.

- Kết thúc lisp khi chọn 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
Khách
Chủ đề này bây giờ đã bị đóng lại để trả lời thêm.

×