Đến nội dung


Hình ảnh
- - - - -

[Yêu cầu] Lisp trim đối tượng


  • Please log in to reply
18 replies to this topic

#1 nguyenkhoadng

nguyenkhoadng

    biết vẽ line

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

Đã gửi 09 June 2014 - 08:17 PM

Mình tìm trên diễn đàn nhưng chưa tìm được lisp trim đối tượng như hình đính kèm.

Mục đích dùng để cắt nét vẽ tường, nhờ các bạn viết giúp mình 1 lisp trim đối tượng mà có thể phân biệt giao nhau giữa tường biên và tường giữa để cho kết quả như hình bên dưới.

 

Untitled_zps6d06fcc3.png

 

Mình cảm ơn!


  • 0

#2 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 09 June 2014 - 10:00 PM

Hơi khác y/c của bạn 1 tí: lisp vẽ tường theo đường trục. Bạn xem ở link này:

www.cadviet.com/forum/topic/71254-yeu-cau-thao-luan-lisp-ve-mat-bang-ket-cau/page-4


  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#3 nguyenkhoadng

nguyenkhoadng

    biết vẽ line

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

Đã gửi 09 June 2014 - 10:36 PM

Hơi khác y/c của bạn 1 tí: lisp vẽ tường theo đường trục. Bạn xem ở link này:

www.cadviet.com/forum/topic/71254-yeu-cau-thao-luan-lisp-ve-mat-bang-ket-cau/page-4

 

Cảm ơn bạn, mình cũng đang sử dụng lisp này :).

nhưng lisp dùng để vẽ tường từ hệ lưới trục ban đầu, nếu bổ sung 1 vài bức tường sau sẽ không dùng đc.

Do vậy nếu thêm 1 vài bức tường thì mình dùng lệnh offset từ đường trục, rồi sau đó trim những nét thừa.

Mình muốn nhờ các bạn giúp 1 lisp để hạn chế bớt thao tác trim như hình bên trên.

Mình cảm ơn!

 

p/s: ah, lisp trên của bạn rất hay, nhưng nếu hệ trục xéo chút thì ko sử dụng được, hình như nó bắt buộc là hình chữ nhật thì phải. Bạn có định phát triển thêm chút cho nó hoàn thiện ko vậy :)


  • 0

#4 nguyenkhoadng

nguyenkhoadng

    biết vẽ line

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

Đã gửi 10 June 2014 - 10:44 AM

Nhờ các bạn giúp viết lisp bên trên với.

 

Mình trình bày rõ thêm về nội dung yêu cầu:

 

gõ lệnh

chọn đối tượng cần trim: (lisp tự động phân biệt các mảng tường giao nhau ở góc, biên, hay giữa)

được kết quả

 

hoặc nếu lisp trên không được thì có thể tách ra:

 

gõ lệnh

chọn đối tượng cần trim: <Góc><Biên><Giữa>:

được kết quả

 

Mình cảm ơn!

 

Góc: tường giao nhau ở góc

Biên: Tường giao nhau ở biên (Ở đây là vị trí số 1)

Giữa: Tường giao nhau ở giữa (Ở đây là vị trí số 2)

 

Untitled_zps6d06fcc3.png


  • 0

#5 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 11 June 2014 - 01:48 PM

Bạn dùng thử cái này. Cần lưu ý:
Bạn dùng thử cái này. Cần lưu ý:

Bạn dùng thử cái này. Cần lưu ý:

1. Nếu là tường góc thì chỉ chọn 2 line rồi nhập phía bị cắt.

2. Nếu là tường biên thì chọn 3 line (biên trong tường và 2 line cắt) rồi cũng nhập phía bị cắt.

3. Nếu là tường giữa thì chọn cả 4 line, không cần nhập phía gì cả.

Sở dĩ phải có giai đoạn nhập phía và số line chọn khác nhau là để cho lisp đỡ phải "phán đoán" (công đoạn này cũng nhiêu khê lắm).

(defun c:cat()
(defun dxf(id v) (cdr (assoc id (entget v))))
(defun midp(d1 d2)  (polar d1 (angle d1 d2) (* 0.5 (distance d1 d2))))
(defun gan(pt v) (inters (dxf 10 v) (dxf 11 v) pt (polar pt (+ 1.5708 (angle (dxf 10 v) (dxf 11 v))) 1) nil))
 
(defun cdd(v1 v2)
(or (equal (angle (dxf 10 v1) (dxf 11 v1)) (angle (dxf 10 v2) (dxf 11 v2)) 0.001)
(equal (angle (dxf 11 v1) (dxf 10 v1)) (angle (dxf 10 v2) (dxf 11 v2)) 0.001))
)
 
(defun trim(v l / ll)
(if (setq ll (mapcar '(lambda(x) (inters (dxf 10 v) (dxf 11 v) (dxf 10 x) (dxf 11 x) nil)) l))      
(command "trim" (acet-list-to-ss l) "" (list v (midp (car ll) (last ll))) "")
nil)
)
 
(defun cat(l1 l2)
(cond ((and (= (length l1) 1) (= (length l2) 1))    
(setq phia (getpoint "\nPhia bi cat:"))
(command "trim" (acet-list-to-ss l2) "" (list (car l1) (gan phia (car l1))) "")
(command "trim" (acet-list-to-ss l1) "" (list (car l2) (gan phia (car l2))) ""))
 
((and (= (length l1) 1) (= (length l2) 2))    
(setq phia (getpoint "\nPhia bi cat:")) (trim (car l1) l2)     
(command "trim" (acet-list-to-ss l1) "" (list (car l2) (gan phia (car l2))) "")
(command "trim" (acet-list-to-ss l1) "" (list (last l2) (gan phia (last l2))) ""))
 
((and (= (length l1) 2) (= (length l2) 2)) 
(trim (car l1) l2) (trim (last l1) l2) 
(trim (car l2) l1) (trim (last l2) l1))
)
)
;;;
(setvar 'edgemode 1)
(command "undo" "be")
(setq ss (acet-ss-to-list (ssget '((0 . "LINE"))))
ss1 nil
os (getvar 'osmode))
(setvar 'osmode 0)
(while ss
(setq ss1 (if (setq tm (vl-remove-if-not '(lambda(x) (cdd (car ss) x)) ss))
(cons tm ss1) (cons (list (car ss)) ss1))
ss  (vl-remove-if '(lambda(x) (cdd (car ss) x)) ss))
)
(setq ss1 (vl-sort ss1 '(lambda(x y) (< (length x) (length y)))))
(cat (car ss1) (last ss1))
(command "undo" "e")
(setvar 'osmode os) (princ)
)
1. Nếu là tường góc thì chỉ chọn 2 line rồi nhập phía bị cắt.
2. Nếu là tường biên thì chọn 3 line (biên trong tường và 2 line cắt) rồi cũng nhập phía bị cắt.
3. Nếu là tường giữa thì chọn cả 4 line, không cần nhập phía gì cả.
Sở dĩ phải có giai đoạn nhập phía và số line chọn khác nhau là để cho lisp đỡ phải "phán đoán" (công đoạn này cũng nhiêu khê lắm).
1. Nếu là tường góc thì chỉ chọn 2 line rồi nhập phía bị cắt.
2. Nếu là tường biên thì chọn 3 line (biên trong tường và 2 line cắt) rồi cũng nhập phía bị cắt.
3. Nếu là tường giữa thì chọn cả 4 line, không cần nhập phía gì cả.
 
1. Nếu là tường góc thì chỉ chọn 2 line rồi nhập phía bị cắt.
2. Nếu là tường biên thì chọn 3 line (biên trong tường và 2 line cắt) rồi cũng nhập phía bị cắt.
3. Nếu là tường giữa thì chọn cả 4 line, không cần nhập phía gì cả.
Sở dĩ phải có giai đoạn nhập phía và số line chọn khác nhau là để cho lisp đỡ phải "phán đoán" (công đoạn này cũng nhiêu khê lắm).

  • 1

#6 nguyenkhoadng

nguyenkhoadng

    biết vẽ line

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

Đã gửi 11 June 2014 - 02:39 PM

Đầu tiên mình cảm ơn bạn đã giúp!

Mình dùng thử lisp và có ý thế này, nếu được mong bạn giúp mình.

1. Bạn có thể thay đổi quét chọn đối tượng bằng click chọn như hiện tại giúp mình.

2. Thay vì nhập phía và số line chọn bạn có thể thay bằng khi gõ lệnh "cat" thì chương trình hỏi <gOc><Bien><Giua> để người dùng nhập vào O hoặc B hoặc G.

như vậy lisp cũng đỡ phải phán đoán.

3. ở góc phải thao tác 2 lần cắt mới hoàn thành.

4. Cái này nhỏ thôi nhưng mình không biết nguyên nhân là do máy mình hay do lisp, nêu lên đây hỏi các bạn luôn: đó là khi thực hiện thao tác cắt từ lisp thì 1 vùng trắng hiện lên từ thanh bên dưới (giống như chơi game mà bị lag vậy). nhờ các bạn giải thích giúp.

 

Video minh họa:

 

Mình cảm ơn!


  • 0

#7 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 11 June 2014 - 03:38 PM

Kể cũng lạ! Nhiều người không thích cứ vào lệnh là hỏi này hỏi nọ, còn bạn thì lại thích!!

Và cũng lạ là bạn không thích quét chọn mà lại nhấp từng cái!!

Nếu nhấp từng cái thì đối với góc tường bạn có thể dùng lệnh chamfer với d=0 cũng giải quyết được rồi, không cần dùng lisp.

Còn với tường biên và nhất là tường giữa không lẽ nhấp 4 lần?

Chắc có lẽ bạn không muốn nhập phía bị cắt chăng?

Không hiểu "ở góc phải phải cắt 2 lần" là sao nữa. Bạn có thể gửi file test lên không?

Cái video không xem được.


  • 1

#8 nguyenkhoadng

nguyenkhoadng

    biết vẽ line

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

Đã gửi 11 June 2014 - 08:05 PM

Bạn có thể đã nhầm ý mình chút rồi

1. Mình muốn quét chọn, nhưng lisp lại click từng cái. Mình đã thử dùng lệnh "cat" và quét chọn thì lisp không thực hiện. vì nếu click từng line thì có thể dùng các lệnh sẵn của cad.

2. Còn câu lệnh hỏi này hỏi nọ là vì mình thấy yêu cầu lisp tự phán đoán tường biên, tường góc hay tường giữa sẽ vất vả cho các bạn viết lisp, và yêu cầu của mình sẽ khó được trợ giúp hơn. do vậy mình mới có ý là khi vào lệnh sẽ hỏi tường <gOc><Bien><Giua>, như vậy lisp sẽ đỡ phải phán đoán.

 

http://www.cadviet.c...testlispcat.dwg

 

Video mình xem bình thường mà bạn.


  • 0

#9 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 12 June 2014 - 08:16 AM

Khi viết lisp thì người viết phải tính sao cho cái lisp của mình có tác dụng tốt nhất, theo nghĩa là giàm đáng kể thao tác để tiết kiệm thời gian và công sức so với cách dùng lệnh của cad.

Thật ra cái lisp trên cho dù làm nhuần nhuyễn cũng chỉ giảm một phần nhỏ thao tác thôi, để tôi thống kê cho bạn thấy so sánh giữ lisp và lệnh trim của cad.

A. Lệnh trim trên 4 line:

1. Góc tường : 2 lần quét(2 line), 4 lần nhấp.

2. Tường biên : 1 lần quét (3 line) , 3 lần nhấp.

3. Tường giữa : 1 lần quét (4 line), 4 lần nhấp.

B. Dùng lisp:

1. Góc tường : 2 lần quét(2 line), 2 lần nhấp.

2. Tường biên : 1 lần quét (3 line) , 1 lần nhấp.

3. Tường giữa : 1 lần quét (4 line), 0 lần nhấp.

Sở dĩ tôi làm lisp này chỉ để muốn thử viết lisp với lệnh trim xem sao, chứ nói thật hiệu quả của lisp không cao so với dùng trim của cad.

Tôi thấy trong video sao bạn không tắt layer tim tường, để như vậy sẽ vướng víu khi quét chọn.


  • 1

#10 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 12 June 2014 - 08:44 AM

Khi viết lisp thì người viết phải tính sao cho cái lisp của mình có tác dụng tốt nhất, theo nghĩa là giàm đáng kể thao tác để tiết kiệm thời gian và công sức so với cách dùng lệnh của cad.

Thật ra cái lisp trên cho dù làm nhuần nhuyễn cũng chỉ giảm một phần nhỏ thao tác thôi, để tôi thống kê cho bạn thấy so sánh giữ lisp và lệnh trim của cad.

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

Sở dĩ tôi làm lisp này chỉ để muốn thử viết lisp với lệnh trim xem sao, chứ nói thật hiệu quả của lisp không cao so với dùng trim của cad.

Tôi thấy trong video sao bạn không tắt layer tim tường, để như vậy sẽ vướng víu khi quét chọn.

 

Hiệu quả là do bác viết ra chưa hiệu quả, chứ nếu có thuật toán thì lisp sẽ hiệu quả vô cùng

Sử dụng Lisp tại đây : http://www.ketcausof...?tid=423&page=2

Lisp chỉ viết cho TH tường giữa vì sử dụng khá nhiều


  • 1

#11 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 12 June 2014 - 09:05 AM

Vậy sao bác Tuệ không giới thiệu ngay từ đầu, tôi đỡ phải viết?

Cái của bác viết cũng chỉ là mở rộng của cái tôi viết thôi mà.

Nói chung tôi chỉ bám theo yêu cầu của chủ thớt thôi, dựa vào cái hình ban đầu.


  • 1

#12 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 12 June 2014 - 09:37 AM

Vậy sao bác Tuệ không giới thiệu ngay từ đầu, tôi đỡ phải viết?

Cái của bác viết cũng chỉ là mở rộng của cái tôi viết thôi mà.

 

Bác thông cảm, rãnh rỗi mình mới ngồi vô viết bài, nhiều lúc bận quá, thấy bài viết đó thì cũng để đó, để khi rãnh rỗi mới hồi âm được, nhiều lúc quên hồi âm luôn

- Về cách thức mình sử dụng Break, không sử dụng trim như của bác


  • 0

#13 ndtnv

ndtnv

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 437 Bài viết
Điểm đánh giá: 384 (khá)

Đã gửi 12 June 2014 - 10:21 AM

Sao không phán đoán theo cách sau (dùng filter để chọn tường)

- Nếu đầu đoạn thẳng nằm trong cửa sổ chọn thì đó là biên hay góc (H1).

- Nếu 2 đầu đoạn thẳng nằm ngoài thì đó là giữa (H2).

Như vậy chỉ cần chọn cửa sổ là đủ


  • 0

#14 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 12 June 2014 - 10:32 AM

Sao không phán đoán theo cách sau (dùng filter để chọn tường)

- Nếu đầu đoạn thẳng nằm trong cửa sổ chọn thì đó là biên hay góc (H1).

- Nếu 2 đầu đoạn thẳng nằm ngoài thì đó là giữa (H2).

Như vậy chỉ cần chọn cửa sổ là đủ

 

Tr­ường hợp quét qua cái "lỗ" thông tầng thì làm răng bác?

Cái "lỗ" đó là biên chứ không phải là giữa

 

P/S Mình đang nói tới TH quét hàng loạt :huh:


  • 0

#15 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 12 June 2014 - 10:41 AM

Nếu nó chỉ vừa "nhú" ra khỏi biên thì được, chứ nếu nó kéo dài và có thể đụng line khác thì không được.

Cái chuyện mình quét 2,3 hay 4 line là chuyện mình phán đoán thay cho lisp được mà. Chứ cứ nhắm mắt quét 4 line rồi mặc kệ cho lisp phán đoán thì tội cho lisp quá, hoặc hỏi này nọ cũng làm dừng chương trình rồi gõ ký tự rồi enter thì rườm rà quá.

Không phải tôi muốn biện minh cho những gì mình viết, nhưng chỉ muốn tìm ra cách tiện lợi nhất khi sử dụng thôi.


  • 0

#16 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 12 June 2014 - 10:49 AM

Mạn bàn thêm tí cho vui cửa vui nhà:

Bài toán này ngó qua thì dễ nhưng mần cho chuẩn thì khá vất vả. Cái vất vả đầu tiên là không biết user vẽ trục và tường theo kiểu gì? Rồi nào là thẳng/xiên/cong... Ngoài tường và trục thì còn có thứ gì bành trướng trên đó không? v.v... và v.v...

Tôi cũng đã có viết 1 lisp tương tự như vậy rồi (link ở bài #2) nhưng không muốn phát triển nữa, bởi nó phụ thuộc user nhiều quá.

Nếu có những điều kiện khống chế bắt buộc phải tuân thủ thì may ra sáng sủa hơn.


  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#17 Hoan1111

Hoan1111

    biết lệnh adcenter

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

Đã gửi 12 June 2014 - 11:10 AM

Video minh họa:

 

Mình cảm ơn!

 

Thấy anh loay hoay với cái lisp trong video cơ cực quá! :) :) :)

Em tò mò muốn hỏi tại sao anh không làm thủ công bằng lệnh ML???

-Tạo một kiểu ML vẽ 2 đường thẳng // không có đường tâm

- Tạo một kiểu ML vẽ 2  đường thẳng // có đường tâm ở giữa (thực ra là vẽ 3 đường thẳng //)

Vẽ hình rồi dùng Mledit để sửa:

114276_khhgff.png


  • 0

66 Câu Phật Học Cho Cuộc Sống : http://ngocchinh.com...-cho-cuoc-song/

Gió đưa cây cải về trời / Rau răm ở lại chịu lời đắng cay...

 

 


#18 ndtnv

ndtnv

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 437 Bài viết
Điểm đánh giá: 384 (khá)

Đã gửi 12 June 2014 - 11:13 AM

Lisp áp dụng cho đa số trường hợp là đạt yêu cầu.

Các trường hợp đặt biệt thì làm thủ công vì thời gian viết thì nhiều mà dùng thì ít.

Có thể chắc chắn là chủ topic sẽ không để  nhú ra nhiều đến nỗi ăn vào hình khác,

nếu là lỗ thông tầng thì stretch cho đầu đoạn thẳng vào trong trước khi dùng.


  • 0

#19 nguyenkhoadng

nguyenkhoadng

    biết vẽ line

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

Đã gửi 12 June 2014 - 12:01 PM

Mình là dân kết cấu, nhưng chủ yếu đi thi công :)

Do vậy kiến thức về cad cũng mới ở mức abc thôi.

Cảm ơn các bạn đã hỗ trợ và cho nhiều ý kiến.

Chúc vui vẻ!


  • 0