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.
Đăng nhập để thực hiện theo  
dunguss3581

[hỏi] viết lisp lấy tọa độ điểm và tên điểm

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

Bạn quả thật là người chịu khó và nhiệt tình.

Đã là một sản phẩm thì bạn liên hoàn thiện nó. ở đây có rất nhiều người. kiểu gì cũng có người quan tâm tới nó và rất cần nó.

Nếu bạn đưa nó ra file csv theo dạng

STT TÊN ĐIỂM TOẠ ĐỘ X TOẠ ĐỘ Y CAO ĐỘ

 

Nếu được vậy thì nhanh hơn các thao tác mình làm. Thì mình là người cần đầu tiên đó bạn ạ.

thanhk!

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

Bạn quả thật là người chịu khó và nhiệt tình.

Đã là một sản phẩm thì bạn liên hoàn thiện nó. ở đây có rất nhiều người. kiểu gì cũng có người quan tâm tới nó và rất cần nó.

Nếu bạn đưa nó ra file csv theo dạng

STT TÊN ĐIỂM TOẠ ĐỘ X TOẠ ĐỘ Y CAO ĐỘ

 

Nếu được vậy thì nhanh hơn các thao tác mình làm. Thì mình là người cần đầu tiên đó bạn ạ.

thanhk!

Hề hề hề,

Chuyện đưa nó ra file csv chả khó khăn gì. Trên diễn đàn đã có rất nhiều file để chguye63n số liệu từ một list (danh sách) sang file csv, txt, xls rồi mà. Chỉ thêm vài dòng code nữa là Ok.

Bạn đã nói vậy thì chờ chút, giờ hết giờ rùi, mình phải chuồn, tối về sẽ post cho bạn.

Chúc bạn vui...

 

Hề hề hề,

Nó đây bạn ạ:


(defun c:gifpr (/ ss n plst i en el p ma k tmp fw)
(vl-load-com)
(setq ss (ssget (list (cons 0 "acad_proxy_entity")))
         n (sslength ss)
         plst (list)
         i 0)
(while (< i n)
    (command "undo" "be")
    (setq en (entlast))
    (command "explode" (ssname ss i) "")
    (while (setq en (entnext en))
          (setq el (entget en))
          (if (= (cdr (assoc 0 el)) "CIRCLE")
              (setq p (cdr (assoc 10 el)))
          )
          (if (= (cdr (assoc 0 el)) "MTEXT")
              (progn 
                      (setq p1 (cdr (assoc 10 el)))
                      (if (equal (- (cadr p) (cadr p1)) 0.15 0.001)
                           (setq ma (cdr (assoc 1 el)))
                      )
               )
           )
       )
       (setq k (ACET-STR-FIND "\\l" ma))
       (setq ma (substr ma (+ k 2) ))
       (setq plst (append plst (list (list p ma)))
                     i (1+ i)
       )
       (command "undo" "e")
       (command "undo" 1)
)
plst

(setq tmp (getfiled "Chon file xuat Text goc" (getvar "dwgprefix") "csv" 1))
(if tmp
   (progn
            (setq fw (open tmp "w")  i 1)
            (foreach po plst
                    (setq str (strcat (itoa i) (chr 44) (cadr po) (chr 44) (rtos (caar po) 2 2) (chr 44) (rtos (cadar po) 2 2) (chr 44) (rtos (caddar po) 2 2))
                              i (1+ i)
                    )
                    (write-line str fw)
            )
            (close fw)
    )
)
(princ)
)

 

Bạn hãy thử và nếu cần bổ sung gì thì post lên 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

Hay thật. Lisp chạy tốt rùi bạn ạ.

(Chỉ có điều nếu bản vẽ mà nó có vài nghìn điểm thì khi lấy số liệu ra, chắc alo cho bạn mình cùng đi uống cafe rùi về là chạy số liệu xong bạn nhỉ)

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

Hay thật. Lisp chạy tốt rùi bạn ạ.

(Chỉ có điều nếu bản vẽ mà nó có vài nghìn điểm thì khi lấy số liệu ra, chắc alo cho bạn mình cùng đi uống cafe rùi về là chạy số liệu xong bạn nhỉ)

Ở đây bác Bình sử dụng vòng lặp While để tạo List và vòng Foreach để ghi dữ liệu vào Excel

Thực ra ở đây chỉ cần vòng lặp While là đủ. Trong vòng lặp While vừa lấy xong tọa độ và tên điểm -> ta ghi vào Excel luôn.

Vậy nhanh hơn, bạn whatcholingon ít tốn thời gian "nhâm nhi" cà phê hơn :D

  • 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
ketxu    2.652

Giảm thao tác Undo và cmdecho thì sẽ giảm được 1 nửa time :)

(defun c:gifpr (/ ss n plst i en el p ma k tmp fw val)
(defun val (a e)(cdr (assoc a (entget e))))
(defun cont(e / tmp)(substr (setq tmp (val 1 e)) (+ 4 (vl-string-search "\\l" tmp))))
(vl-load-com)
(setq Start (getvar "Millisecs"))
(setvar 'cmdecho 0)
(command "undo" "Mark")
(setq ss (ssget (list (cons 0 "acad_proxy_entity")))
     	n (sslength ss)
     	plst (list)
     	i -1
 tmp (getfiled "Chon file xuat Text goc" (getvar "dwgprefix") "csv" 1)
 fw (open tmp "w")
)
(while (< i n)    
(setq en (entlast))
(command "explode" (ssname ss (setq i (1+ i))))
(while (setq en (entnext en))  
  (cond  ((= (val 0 en) "CIRCLE") (setq p (val 10 en)))
(T (if (= (val 62 en) 2)(setq num (cont en))(setq nm (cont en))))
  )  
 )
  (write-line (strcat num (chr 44) nm (chr 44) (apply 'strcat (mapcar '(lambda(x)(strcat (rtos x 2 2) (chr 44))) p))) fw)

)
(close fw)
(command "undo" "back")
(setq End (getvar "Millisecs"))
(alert (vl-princ-to-string (* (- end start) 0.001)))
(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
dunguss3581    5

cảm ơn các bác đã quan tâm, lisp của các bác rất hay nhưng tiếc rằng trong topo lại không chạy được, topo là phần mềm chạy trên nền cad2005 vậy mà lại không dùng được thật khó hiểu. nhận lisp nhưng lại không nhận lệnh này các bác ạ: (setq ss (ssget (list (cons 0 "acad_proxy_entity")))

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

Giảm thao tác Undo và cmdecho thì sẽ giảm được 1 nửa time :)

(defun c:gifpr (/ ss n plst i en el p ma k tmp fw val)
(defun val (a e)(cdr (assoc a (entget e))))
(defun cont(e / tmp)(substr (setq tmp (val 1 e)) (+ 4 (vl-string-search "\\l" tmp))))
(vl-load-com)
(setq Start (getvar "Millisecs"))
(setvar 'cmdecho 0)
(command "undo" "Mark")
(setq ss (ssget (list (cons 0 "acad_proxy_entity")))
     	n (sslength ss)
     	plst (list)
     	i -1
 tmp (getfiled "Chon file xuat Text goc" (getvar "dwgprefix") "csv" 1)
 fw (open tmp "w")
)
(while (< i n)    
(setq en (entlast))
(command "explode" (ssname ss (setq i (1+ i))))
(while (setq en (entnext en))  
  (cond  ((= (val 0 en) "CIRCLE") (setq p (val 10 en)))
(T (if (= (val 62 en) 2)(setq num (cont en))(setq nm (cont en))))
  )  
 )
  (write-line (strcat num (chr 44) nm (chr 44) (apply 'strcat (mapcar '(lambda(x)(strcat (rtos x 2 2) (chr 44))) p))) fw)

)
(close fw)
(command "undo" "back")
(setq End (getvar "Millisecs"))
(alert (vl-princ-to-string (* (- end start) 0.001)))
(princ)
)

 

Ketxu xem lại lsp:

Sao khi Lấy text ghi chú thì nó lại bỏ mất ký tự ở trước là lý do gì vậy. ( vd: BD thì chỉ có D, LS thì chỉ có S)

STT cũng chạy lung tung nữa, Ket sửa lại giùm nhé.

Thanks!

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
dunguss3581    5

 

Mình chưa hiểu ý của bạn lắm:

1) bổ sung thêm điểm mia (ví dụ khu địa hình này có chỗ bị lũng mình muốn thêm điểm mia)

2) chèn thêm cọc trên một tuyến đường.

Bạn có thể up cái hình or file nên mình ngó cái xem đầu đuôi nó thế nào.

đầu đuôi nó thế này bác nhé: http://www.cadviet.com/upfiles/3/106914_drawing1_5.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
ketxu    2.652

 

Ketxu xem lại lsp:

Sao khi Lấy text ghi chú thì nó lại bỏ mất ký tự ở trước là lý do gì vậy. ( vd: BD thì chỉ có D, LS thì chỉ có S)

STT cũng chạy lung tung nữa, Ket sửa lại giùm nhé.

Thanks!

1. À bạn sửa số 4 trong hàm cont thành 3

2. STT mình lấy theo Text vàng đấy nhé, nó chạy thep thứ tự bạn chọn thôi. Mình thấy bác Bình lấy STT chạy theo biến đếm có lẽ là không chuẩn. Bạn muốn sắp xếp lại thì hãy sửa việc write-line vào file ngay thành việc tạo list dữ liệu trước (như bác Bình làm) rồi sắp xếp lại trước khi ghi. Phần đấy mình dành cho bạn ^^

Ngay cả trong file excel bạn cũng có thể dùng Sort để sắp xếp được mà

  • 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

đầu đuôi nó thế này bác nhé: http://www.cadviet.c..._drawing1_5.dwg

 

Chèn cọc để nó nhận luôn mã điểm thì mình không biết trong topo có lệnh đó không. Mình làm thủ công thui. (Chèn cọc xong lấy số liệu sửa lại tên cọc. Cập nhật dữ liệ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
phamthanhbinh    3.123
cảm ơn các bác đã quan tâm, lisp của các bác rất hay nhưng tiếc rằng trong topo lại không chạy được, topo là phần mềm chạy trên nền cad2005 vậy mà lại không dùng được thật khó hiểu. nhận lisp nhưng lại không nhận lệnh này các bác ạ: (setq ss (ssget (list (cons 0 "acad_proxy_entity")))

Hề hề hề,

Đây là cái lisp mình chỉnh lại theo hướng các bác Tue_NV và Ketxu đã góp ý. Hy vọng nó sẽ nhanh hơn cái lisp cũ. Rất mong các bác test và cho ý kiến.

(defun c:gifpr (/ ss n plst i en el p ma k tmp fw)
(vl-load-com)
(setvar "cmdecho" 0)
(setq ss (ssget (list (cons 0 "acad_proxy_entity")))
         n (sslength ss)
         plst (list)
         i 0)

(setq tmp (getfiled "Chon file xuat Text goc" (getvar "dwgprefix") "csv" 1))
(if tmp
   (progn
            (setq fw (open tmp "w") )
            (command "undo" "be")
            (while (< i n)

                    (setq en (entlast))
                    (command "explode" (ssname ss i))
                    (while (setq en (entnext en))
                               (setq el (entget en))
                               (if (= (cdr (assoc 0 el)) "CIRCLE")
                                   (setq p (cdr (assoc 10 el)))
                               )
                              (if (= (cdr (assoc 0 el)) "MTEXT")
                                  (progn 
                                         (setq p1 (cdr (assoc 10 el)))
                                         (if (equal (- (cadr p) (cadr p1)) 0.15 0.001)
                                             (setq ma (cdr (assoc 1 el)))
                                         )
                                  )
                               )
                     )
                     (setq k (ACET-STR-FIND "\\l" ma))
                     (setq ma (substr ma (+ k 2) ))
                     (setq   i (1+ i))
                     (setq str (strcat (itoa i) (chr 44) ma (chr 44) (rtos (car p) 2 2) (chr 44) (rtos (cadr p) 2 2) (chr 44) (rtos (caddr p) 2 2)) )
                     (write-line str fw)
           )
           (command "undo" "e")
           (command "undo" 1)             
           (close fw)
    )
)
(princ)
)

 

@ bác chủ thớt: Theo ngu ý của mình thì có thể trong cái gọi là TOPO của bác nó không có đối tượng là Acad_proxy_entity bác ạ. Đối tượng này chỉ khi xuất từ Topo sang Cad nó mới tạo thành. Bởi thế nên cái thằng ssget nó chả nhận được thằng cu tí nào cả.

Do mình chả biết cái chi về thằng Topo này nên chỉ đoán mò theo cái kết quả mà bác đưa ra. Trúng hay trật thì các bác đừng trách.

Nếu quả đúng vậy thì tại sao bác chủ thớt lại cứ nhất thiết phải chạy lisp trên nền Topo nhỉ?? Nếu chạy trong CAD rồi trả cái kết quả về Topo thì không được ư??? Mình cứ thiển nghĩ rằng nếu thằng Topo xuất được sang CAd thì ắt phải có cách xuất ngược từ CAd về Topo để xử lý.

Mặt khác cái đích cuối cùng bác cần là cái chi?? Nếu sử dụng cái kết quả của lisp này thì có vấn đề gì không thỏa mãn cho cái đích cuối cùng ấy. Hay chỉ là vấn đề bác không thích dùng do nó không chạy được với Topo???

Mình thì cho rằng cái cần là cái đích đó, đi bằng cách nào, làm bằng cách chi mà đạt được cái đích đó thì cho dù nó có hơi chậm cũng còn hơn ngồi chờ cách tối ưu thỏa mãn cái ý thích của mình mà chửa biết lúc nào có được.

Chừng nào bác có được cái tối ưu bác cần có thể bác hãy chia sẻ cái đó để anh em được học hỏi thêm chút chút bác nhé.

Chúc bác vui.

Chỉnh sửa theo phamthanhbinh
Sửa lại bổ sung lisp

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
1. À bạn sửa số 4 trong hàm cont thành 3 2. STT mình lấy theo Text vàng đấy nhé, nó chạy thep thứ tự bạn chọn thôi. Mình thấy bác Bình lấy STT chạy theo biến đếm có lẽ là không chuẩn. Bạn muốn sắp xếp lại thì hãy sửa việc write-line vào file ngay thành việc tạo list dữ liệu trước (như bác Bình làm) rồi sắp xếp lại trước khi ghi. Phần đấy mình dành cho bạn ^^ Ngay cả trong file excel bạn cũng có thể dùng Sort để sắp xếp được mà
1. À bạn sửa số 4 trong hàm cont thành 3 2. STT mình lấy theo Text vàng đấy nhé, nó chạy thep thứ tự bạn chọn thôi. Mình thấy bác Bình lấy STT chạy theo biến đếm có lẽ là không chuẩn. Bạn muốn sắp xếp lại thì hãy sửa việc write-line vào file ngay thành việc tạo list dữ liệu trước (như bác Bình làm) rồi sắp xếp lại trước khi ghi. Phần đấy mình dành cho bạn ^^ Ngay cả trong file excel bạn cũng có thể dùng Sort để sắp xếp được mà

Hề hề hề.

Thanks bác ketxu về cái hàm cont . Nhưng bác thử xem lại chỗ hàm (cond .... ) một chút. Vì cái thằng Acad_proxy_entity nàn khi nổ ra se có 4 đối tượng, 1 circle và 3 thằng text cơ bác ạ,

Ở điều kiện thứ nhất cho cái thằng circle thì không có gì phải bàn nhưng phần điều kiện T thì bác mới xử lý thằng màu vàng để lấy biến num . Còn hai thằng nữa bác đều cho nó làm tham chiếu để lấy biến nm hả bác. Nhỡ vì lý do gì đó mà nó lấy lộn thì sao bác nhỉ.

Hay là bác căn cứ vào trật tự của các text có trong thằng ACAD_PROXY_ENTITY để đảm bảo rằng nó không bị lộn. Nếu vậy thì cái trật tự này có cách chi để xác định được nó bác hè???

Và còn tí ti nữa là do bác đặt điều kiện trong hàm while là (< i n) mà khởi đi từ i= -1 nên nó bị dư một dòng kết quả bác ạ. Có nhẽ nên thay bằng (< (1+ i) n) thì hơn.

Hề hề hề,

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

  • 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
Tue_NV    3.841

Hề hề hề.

Thanks bác ketxu về cái hàm cont . Nhưng bác thử xem lại chỗ hàm (cond .... ) một chút. Vì cái thằng Acad_proxy_entity nàn khi nổ ra se có 4 đối tượng, 1 circle và 3 thằng text cơ bác ạ,

Ở điều kiện thứ nhất cho cái thằng circle thì không có gì phải bàn nhưng phần điều kiện T thì bác mới xử lý thằng màu vàng để lấy biến num . Còn hai thằng nữa bác đều cho nó làm tham chiếu để lấy biến nm hả bác. Nhỡ vì lý do gì đó mà nó lấy lộn thì sao bác nhỉ.

Hay là bác căn cứ vào trật tự của các text có trong thằng ACAD_PROXY_ENTITY để đảm bảo rằng nó không bị lộn. Nếu vậy thì cái trật tự này có cách chi để xác định được nó bác hè???

Hề hề hề,

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

Thường thì chương trình Tôpo gì đó khi chạy chắc là nó phải tạo đối tượng theo quy luật rồi bác ạ

Ví dụ như trong file thì cái Text màu xanh khi Explode ra thì nó được tạo ra sau cùng, trước nó là Text vàng, trước đó là Text trắng

 

Ta cũng có thể lọc theo điều kiện

- Text màu xanh là Text chữ (distof Text) -> nil

- Text màu vàng là Text số nguyên (type Text) -> INT

- Text màu trắng là Text số thực (type Text) -> REAL

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
ketxu    2.652

Hề hề hề.

Thanks bác ketxu về cái hàm cont . Nhưng bác thử xem lại chỗ hàm (cond .... ) một chút. Vì cái thằng Acad_proxy_entity nàn khi nổ ra se có 4 đối tượng, 1 circle và 3 thằng text cơ bác ạ,

Gọi là xét điều kiện cho vui, chứ khi explode thằng này ra chắc chắn các entity đã sắp xếp theo thứ tự rồi bác ạ. Thằng đầu là circle, 2 là trắng, 3 vàng 4 xanh, lấy theo thứ tự cũng được :D. Bác lấy entnext kiểm tra là thấy

Cái này e gặp khi xử lý cắt đôi 1 dimension ^^

  • 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
dunguss3581    5

Hề hề hề,

Đây là cái lisp mình chỉnh lại theo hướng các bác Tue_NV và Ketxu đã góp ý. Hy vọng nó sẽ nhanh hơn cái lisp cũ. Rất mong các bác test và cho ý kiến.

(defun c:gifpr (/ ss n plst i en el p ma k tmp fw)
(vl-load-com)
(setvar "cmdecho" 0)
(setq ss (ssget (list (cons 0 "acad_proxy_entity")))
         n (sslength ss)
         plst (list)
         i 0)

(setq tmp (getfiled "Chon file xuat Text goc" (getvar "dwgprefix") "csv" 1))
(if tmp
   (progn
        	(setq fw (open tmp "w") )
        	(command "undo" "be")
        	(while (< i n)

                	(setq en (entlast))
                	(command "explode" (ssname ss i))
                	(while (setq en (entnext en))
                               (setq el (entget en))
                               (if (= (cdr (assoc 0 el)) "CIRCLE")
                                   (setq p (cdr (assoc 10 el)))
                               )
                          	(if (= (cdr (assoc 0 el)) "MTEXT")
                              	(progn
                                         (setq p1 (cdr (assoc 10 el)))
                                         (if (equal (- (cadr p) (cadr p1)) 0.15 0.001)
                                             (setq ma (cdr (assoc 1 el)))
                                         )
                              	)
                               )
                     )
                     (setq k (ACET-STR-FIND "\\l" ma))
                     (setq ma (substr ma (+ k 2) ))
                     (setq   i (1+ i))
                     (setq str (strcat (itoa i) (chr 44) ma (chr 44) (rtos (car p) 2 2) (chr 44) (rtos (cadr p) 2 2) (chr 44) (rtos (caddr p) 2 2)) )
                     (write-line str fw)
           )
           (command "undo" "e")
           (command "undo" 1)            
           (close fw)
	)
)
(princ)
)

 

@ bác chủ thớt: Theo ngu ý của mình thì có thể trong cái gọi là TOPO của bác nó không có đối tượng là Acad_proxy_entity bác ạ. Đối tượng này chỉ khi xuất từ Topo sang Cad nó mới tạo thành. Bởi thế nên cái thằng ssget nó chả nhận được thằng cu tí nào cả.

Do mình chả biết cái chi về thằng Topo này nên chỉ đoán mò theo cái kết quả mà bác đưa ra. Trúng hay trật thì các bác đừng trách.

Nếu quả đúng vậy thì tại sao bác chủ thớt lại cứ nhất thiết phải chạy lisp trên nền Topo nhỉ?? Nếu chạy trong CAD rồi trả cái kết quả về Topo thì không được ư??? Mình cứ thiển nghĩ rằng nếu thằng Topo xuất được sang CAd thì ắt phải có cách xuất ngược từ CAd về Topo để xử lý.

Mặt khác cái đích cuối cùng bác cần là cái chi?? Nếu sử dụng cái kết quả của lisp này thì có vấn đề gì không thỏa mãn cho cái đích cuối cùng ấy. Hay chỉ là vấn đề bác không thích dùng do nó không chạy được với Topo???

Mình thì cho rằng cái cần là cái đích đó, đi bằng cách nào, làm bằng cách chi mà đạt được cái đích đó thì cho dù nó có hơi chậm cũng còn hơn ngồi chờ cách tối ưu thỏa mãn cái ý thích của mình mà chửa biết lúc nào có được.

Chừng nào bác có được cái tối ưu bác cần có thể bác hãy chia sẻ cái đó để anh em được học hỏi thêm chút chút bác nhé.

Chúc bác vui.

sao tui dùng không được báo lỗi này: (acet-str-find <find> <string> [<ignore-case> [<use-regexp>]])

; error: ADS request error

các bác xem giúp tui mò không ra.

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

sao tui dùng không được báo lỗi này: (acet-str-find <find> <string> [<ignore-case> [<use-regexp>]])

; error: ADS request error

các bác xem giúp tui mò không ra.

Hề hề hề,

Hổng biết Bạn dùng cho Cad hay cho topo và CAD của bạn đã cài express tools chưa nhỉ???

Bạn có thể post cái bản vẽ bạn đã chạy thử trên đó lên để mình check lỗi. Nhớ lưu về Cad2004 vì mình toàn sử dụng đồ 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
dunguss3581    5

Hề hề hề,

Hổng biết Bạn dùng cho Cad hay cho topo và CAD của bạn đã cài express tools chưa nhỉ???

Bạn có thể post cái bản vẽ bạn đã chạy thử trên đó lên để mình check lỗi. Nhớ lưu về Cad2004 vì mình toàn sử dụng đồ cổ....

http://www.cadviet.c..._drawing1_6.dwg tui cài express rồ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
dunguss3581    5

theo tui đoán là thiếu các đối tượng mã điểm. nếu gặp trường hợp chỉ có cao độ không có các đối tượng mã điểm và số thứ tự thì các bác để trống trong file xuất ra nhé. nhưng vẫn có giá trị cao độ.

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
ketxu    2.652

Thông báo trên là thông báo sai cú pháp hoặc đối số cho hàm ACET, cụ thể trong lisp là acet-str-find

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
dunguss3581    5

Gọi là xét điều kiện cho vui, chứ khi explode thằng này ra chắc chắn các entity đã sắp xếp theo thứ tự rồi bác ạ. Thằng đầu là circle, 2 là trắng, 3 vàng 4 xanh, lấy theo thứ tự cũng được :D. Bác lấy entnext kiểm tra là thấy

Cái này e gặp khi xử lý cắt đôi 1 dimension ^^

bác cho em hỏi nhé: nếu trong trường hợp vàng không có hoặc xanh không có hoặc không có vàng và xanh thì có phải xét điều kiện chứ. phải không bá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
ketxu    2.652

Tất nhiên rồi :) Cái đó do bạn thôi. Trong trường hợp có khả năng có điểm k giống form mẫu thì bạn phải đặt vấn đề. Lisp gì gì mình viết bên trên hình như đã xét nếu 1 thằng là màu gì đó thì ...abc... Muốn thêm chỉ cần thêm vào đó thôi, cũng không phải vấ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

bác cho em hỏi nhé: nếu trong trường hợp vàng không có hoặc xanh không có hoặc không có vàng và xanh thì có phải xét điều kiện chứ. phải không bác

Hề hề hề,

Cái bạn đoán chả sai tí nào.

Lỗi là do cái cấu tạo acad_proxy_entity của bạn chả hề có các mã điểm và số thứ tự điểm như bản vẽ trước bạn đã post. Đồng thời cấu tạo của nó khác hẳn, vị trí tương đối của diểm đặt text cao độ so với circle không giống như bản vẽ trước.

Vì thế nên khi lọc text nó đã loại tuốt luốt và không hề có được các biến bạn cần và hàm acet-str-find báo lỗi bạn ạ.

Bạn thử dùng lisp đã sửa dưới đây để cho cái bản vẽ của bạn gửi xem đã thỏa mãn yêu cầu chưa nhé.


(defun c:gifpr (/ ss n plst i en el p p1 ma sst k tmp fw)
(vl-load-com)
(setvar "cmdecho" 0)
(setq ss (ssget (list (cons 0 "acad_proxy_entity")))
         n (sslength ss)
         plst (list)
         i 0)

(setq tmp (getfiled "Chon file xuat Text goc" (getvar "dwgprefix") "csv" 1))
(if tmp
   (progn
            (setq fw (open tmp "w")  )
            (command "undo" "be")
            (while (< i n)

                    (setq en (entlast))
                    (command "explode" (ssname ss i) )
                    (while (setq en (entnext en))
                               (setq el (entget en))
                               (if (= (cdr (assoc 0 el)) "CIRCLE")
                                   (setq p (cdr (assoc 10 el)))
                               )
                              (if (= (cdr (assoc 0 el)) "MTEXT")
                                  (progn 
                                         (setq p1 (cdr (assoc 10 el)))
                                         (if (equal (- (cadr p) (cadr p1)) 0.15 0.001)
                                             (setq ma (cdr (assoc 1 el)))
                                             (setq ma "none")
                                         )
                                         (if (equal (- (cadr p1) (cadr p)) 1.15 0.001)
                                             (setq stt (cdr (assoc 1 el)))
                                             (setq stt "unknown")
                                         )
                                  )
                               )

                     )
                     (if (/= ma "none")
                         (progn
                             (setq k (ACET-STR-FIND "\\l" ma))
                             (setq ma (substr ma (+ k 2) ))
                         )
                     )
                     (if (/= stt "unknown")
                         (progn
                               (setq k (ACET-STR-FIND "\\l" stt))
                               (setq stt (substr stt (+ k 2) ))
                         )
                     )
                     (setq   i (1+ i))
                     (setq str (strcat stt (chr 44) ma (chr 44) (rtos (car p) 2 2) (chr 44) (rtos (cadr p) 2 2) (chr 44) (rtos (caddr p) 2 2)) )
                     (write-line str fw)
           )
           (command "undo" "e")
           (command "undo" 1)             
           (close fw)
    )
)

(princ)
)

Nên nhớ rằng nếu có được thì mình cũng chỉ đảm bảo nó dùng được cho hai loại đối tượng Acad_proxy_entity của hai bản vẽ bạn đã post mà thôi. Các Acad_proxy_entity khác mà bạn có thì mình không biết nên bạn hãy tự điều chỉnh nếu có thể khi gặp. Còn nếu không điều chỉnh được thì hãy post lên diễn đàn mình sẽ xem xét xem có thể điều chỉnh được không. Lỗi không phải của lisp bạn nhé.

Chỉnh sửa theo phamthanhbinh
bổ sung lisp theo yêu cầu mớ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
dunguss3581    5

các bac nghiên cứu giúp em sao cho lisp không phụ thuộc vào màu, cỡ chữ, khoảng cách từ text tới dấu chấm tròn, hay vị trí của các text. trong 4 thành phần có 2 thành phần bắt buộc là chấm tròn và giá trị cao độ. còn 2 text stt và mã điểm có thể có có thể không. đó là điều kiện đầu vào. file VD:

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

Đăng nhập để thực hiện theo  

×