Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
47 replies to this topic

#21 dunguss3581

dunguss3581

    biết lệnh rotate

  • Advance Member
  • PipPipPip
  • 139 Bài viết
Điểm đánh giá: 5 (bình thường)

Đã gửi 18 April 2012 - 03:54 PM


Đúng rùi. mình chỉnh trên topo đưa cái ACAD_PROXY_ENTITY về block (khối thuộc tính) xong dùng lênh EATTEXT của cad để xuất ra số liệu.

bạn có sử dụng topo à? mình muốn gán mã diểm cho tên cọc bạn có cách nào nhanh không?
  • 0

#22 whatcholingon

whatcholingon

    biết lệnh break

  • Members
  • PipPipPipPip
  • 222 Bài viết
Điểm đánh giá: 37 (tàm tạm)

Đã gửi 18 April 2012 - 04:01 PM

bạn có sử dụng topo à? mình muốn gán mã diểm cho tên cọc bạn có cách nào nhanh không?


Mình chỉ biết chút xíu về nó thui. đang tìm hiểu mà. mình chủ yếu chạy trên nova ( cũng chỉ biết chạy tuyến và một số lệnh)
Gán mã điểm ở đây là như thế nào.
1) gán cho toàn bộ số điểm mia
2) gán cho điểm mia mà mình chọn
  • 0

#23 dunguss3581

dunguss3581

    biết lệnh rotate

  • Advance Member
  • PipPipPip
  • 139 Bài viết
Điểm đánh giá: 5 (bình thường)

Đã gửi 18 April 2012 - 04:06 PM


Mình chỉ biết chút xíu về nó thui. đang tìm hiểu mà. mình chủ yếu chạy trên nova ( cũng chỉ biết chạy tuyến và một số lệnh)
Gán mã điểm ở đây là như thế nào.
1) gán cho toàn bộ số điểm mia
2) gán cho điểm mia mà mình chọn

mình muốn phát sinh cọc nhưng tên cọc nhận mã điểm làm tên cọc. bac có cách không?
  • 0

#24 whatcholingon

whatcholingon

    biết lệnh break

  • Members
  • PipPipPipPip
  • 222 Bài viết
Điểm đánh giá: 37 (tàm tạm)

Đã gửi 18 April 2012 - 04:13 PM

mình muốn phát sinh cọc nhưng tên cọc nhận mã điểm làm tên cọc. bac có cách không?


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

#25 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 18 April 2012 - 04:29 PM

mình muốn phát sinh cọc nhưng tên cọc nhận mã điểm làm tên cọc. bac có cách không?

Hề hề hề,
Đây là lisp dùng để lấy danh sách tọa độ các điểm cùng với mã tên điểm như bạn yêu cầu, Tuy nhiên có vẻ như bạn không cần nữa. Dù sao thì cũng đã lỡ mần nên cứ gửi lên đây. Hy vọng sẽ có ích cho ai đó cần quan tâm tới nó.
Mình chả hiểu TOPO nó là cái giống oẳn tà roằn nào nên chả biết lisp này có xài được trên đó hay không.
Còn trên bản vẽ CAD như chủ thớt đã gửi thì nó chạy cũng coi được. Sau khi đã có cái danh sách này thì tùy theo yêu cầu mà các bác có thể xử lý thêm giấm thêm ớt cho nó vừa với cái khẩu vị của các bác vậy.
Hề hề hề,...


(defun c:gifpr ()
(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
)

Vì là chả biết có ai còn quan tâm nữa nên mình cũng chả thèm khử biến nữa. Điều này nếu ai cần có thể tự xử lý được mà, Chỉ nhắc vậy để mọi người lưu ý.
Hề hề hề,..
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#26 whatcholingon

whatcholingon

    biết lệnh break

  • Members
  • PipPipPipPip
  • 222 Bài viết
Điểm đánh giá: 37 (tàm tạm)

Đã gửi 18 April 2012 - 04:46 PM

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

#27 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 18 April 2012 - 04:59 PM

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é.
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#28 whatcholingon

whatcholingon

    biết lệnh break

  • Members
  • PipPipPipPip
  • 222 Bài viết
Điểm đánh giá: 37 (tàm tạm)

Đã gửi 18 April 2012 - 11:15 PM

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

#29 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 18 April 2012 - 11:24 PM

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

#30 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 19 April 2012 - 12:28 AM

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

  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#31 dunguss3581

dunguss3581

    biết lệnh rotate

  • Advance Member
  • PipPipPip
  • 139 Bài viết
Điểm đánh giá: 5 (bình thường)

Đã gửi 19 April 2012 - 08:08 AM

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

#32 whatcholingon

whatcholingon

    biết lệnh break

  • Members
  • PipPipPipPip
  • 222 Bài viết
Điểm đánh giá: 37 (tàm tạm)

Đã gửi 19 April 2012 - 08:15 AM

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

#33 dunguss3581

dunguss3581

    biết lệnh rotate

  • Advance Member
  • PipPipPip
  • 139 Bài viết
Điểm đánh giá: 5 (bình thường)

Đã gửi 19 April 2012 - 08:55 AM


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.c..._drawing1_5.dwg
  • 0

#34 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 19 April 2012 - 10:37 AM


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

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#35 whatcholingon

whatcholingon

    biết lệnh break

  • Members
  • PipPipPipPip
  • 222 Bài viết
Điểm đánh giá: 37 (tàm tạm)

Đã gửi 19 April 2012 - 10:38 AM

đầ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).
  • 0

#36 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 19 April 2012 - 12:31 PM

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 &quot;acad_proxy_entity&quot;)))

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.

Bài viết đã được chỉnh sửa nội dung bởi phamthanhbinh: 19 April 2012 - 01:48 PM
Sửa lại bổ sung lisp

  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#37 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 19 April 2012 - 03:18 PM

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.
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#38 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 19 April 2012 - 03:28 PM

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

#39 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 19 April 2012 - 03:48 PM

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

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#40 dunguss3581

dunguss3581

    biết lệnh rotate

  • Advance Member
  • PipPipPip
  • 139 Bài viết
Điểm đánh giá: 5 (bình thường)

Đã gửi 09 May 2012 - 11:13 AM

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