Đến nội dung


Hình ảnh
- - - - -

[Yêu cầu] Cắt đường thẳng tại điểm giao


  • Please log in to reply
13 replies to this topic

#1 almodeus

almodeus

    biết vẽ arc

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

Đã gửi 18 February 2011 - 01:20 PM

trên diễn đàn mình có thấy có một lisp Break tại một điểm....lisp như sau:

(defun c:bf (/ dt diem)


(setq dt (car (entsel "\nVao doi tuong can chat")))
(if dt
(progn
(redraw dt 3)
(setq diem (getpoint "\nVao diem chat: "))
(redraw dt 4)
)
)
(if (and dt diem)
(command ".break" dt diem diem)
)
)



Các bạn có thể nâng cấp nó lên theo chế độ click điểm cần cắt liên tục không, chứ mỗi lần lại gõ lệnh lại hơi phiền ...
Và nếu được thì nâng cấp thêm là thay vì cắt tại điểm click thì cắt tại điểm giao nhau:
1) ta chọn đối tượng cần chặt điểm có chế độ chọn nhiều đối tượng cùng lúc(gọi là đối tượng 1)
2) chọn đối tượng giao với nó chú ý là có chế độ chọn nhiều đường cùng lúc nha (đối tượng 2)
3) lệnh sẽ chặt đối tượng 1 được chọn tại những diểm giao với đố tượng 2 và đồng thời nó sẽ hỏi là đối tượng 2 có bị chặt điểm tại điểm giao luôn không (yes/no)

Hình đã gửi
mình có cái lisp này nhưng nó lại không cho chọn liên tục, và ko có chế độ thứ 3
(defun c:Boj ()


(setq ent1 (car (setq ent (entsel "\nVao doi tuong can cat: "))))
(redraw ent1 3)
(setq ent2 (car (entsel "\nVao doi tuong dung de cat: ")))
(redraw ent1 4)
(setq giao (giaodt ent1 ent2))
(if giao
(foreach pp giao
(command "break" ent "f" pp "@")
)
(alert "2 doi tuong khong giao nhau!")
)
(princ)
)
(defun GiaoDT (ent1 ent2)
(setq ob1 (vlax-ename->vla-object ent1)
ob2 (vlax-ename->vla-object ent2)
)
(setq g (vlax-variant-value
(vla-IntersectWith ob1 ob2 acExtendNone)
)
)
(if (/= (vlax-safearray-get-u-bound g 1) -1)
(setq g (vlax-safearray->list g))
(setq g nil)
)
(if g
(progn
(setq kq nil
sd (fix (/ (length g) 3))
)
(repeat sd
(setq kq (append kq (list (list (car g) (cadr g) (caddr g))))
g (cdddr g)
)
)
kq
)
nil
)
)


Bác nào có thể viết zùm cái lisp đó nhé (nếu kết hợp luôn cả chặt điểm tại click luon thi cang tot)
  • 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 18 February 2011 - 01:40 PM

trên diễn đàn mình có thấy có một lisp Break tại một điểm....lisp như sau:

(defun c:bf (/ dt diem)
(setq dt (car (entsel "\nVao doi tuong can chat")))
(if dt
(progn
(redraw dt 3)
(setq diem (getpoint "\nVao diem chat: "))
(redraw dt 4)
)
)
(if (and dt diem)
(command ".break" dt diem diem)
)
)


Các bạn có thể nâng cấp nó lên theo chế độ click điểm cần cắt liên tục không, chứ mỗi lần lại gõ lệnh lại hơi phiền ...
Và nếu được thì nâng cấp thêm là thay vì cắt tại điểm click thì cắt tại điểm giao nhau:
1) ta chọn đối tượng cần chặt điểm có chế độ chọn nhiều đối tượng cùng lúc(gọi là đối tượng 1)
2) chọn đối tượng giao với nó chú ý là có chế độ chọn nhiều đường cùng lúc nha (đối tượng 2)
3) lệnh sẽ chặt đối tượng 1 được chọn tại những diểm giao với đố tượng 2 và đồng thời nó sẽ hỏi là đối tượng 2 có bị chặt điểm tại điểm giao luôn không (yes/no)

mình có cái lisp này nhưng nó lại không cho chọn liên tục, và ko có chế độ thứ 3
(defun c:Boj ()
(setq ent1 (car (setq ent (entsel "\nVao doi tuong can cat: "))))
(redraw ent1 3)
(setq ent2 (car (entsel "\nVao doi tuong dung de cat: ")))
(redraw ent1 4)
(setq giao (giaodt ent1 ent2))
(if giao
(foreach pp giao
(command "break" ent "f" pp "@")
)
(alert "2 doi tuong khong giao nhau!")
)
(princ)
)
(defun GiaoDT (ent1 ent2)
(setq ob1 (vlax-ename->vla-object ent1)
ob2 (vlax-ename->vla-object ent2)
)
(setq g (vlax-variant-value
(vla-IntersectWith ob1 ob2 acExtendNone)
)
)
(if (/= (vlax-safearray-get-u-bound g 1) -1)
(setq g (vlax-safearray->list g))
(setq g nil)
)
(if g
(progn
(setq kq nil
sd (fix (/ (length g) 3))
)
(repeat sd
(setq kq (append kq (list (list (car g) (cadr g) (caddr g))))
g (cdddr g)
)
)
kq
)
nil
)
)

Bác nào có thể viết zùm cái lisp đó nhé (nếu kết hợp luôn cả chặt điểm tại click luon thi cang tot)

Đây! Mình nhặt được trên mạng, có bổ sung chút xíu. Hy vọng bạn hài lòng
http://www.cadviet.c...t_doi_tuong.zip
  • 2

* 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 thichhoabinh

thichhoabinh

    biết vẽ circle

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

Đã gửi 18 February 2011 - 01:50 PM

Thư viện break all này đã được giới thiệu trên Cadviet khá lâu rồi còn j :)
Xin hỏi chủ topic đã tìm kiếm chưa ? Đã bít cách dùng chức năng <code> không ? Có thấy khó chịu khi đọc lại bài post của mình với 1 đống chữ to tướng không ? Và đã phân biệt thế nào là đối tượng và nhóm đối tượng chưa.hề
  • 0

#4 almodeus

almodeus

    biết vẽ arc

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

Đã gửi 18 February 2011 - 02:35 PM

Cám ơn về lisp breakall này...còn cái lisp chặt điểm có ai nâng cấp nó thành multil click không...
(defun c:bf (/ dt diem)
(setq dt (car (entsel "\nVao doi tuong can chat")))
(if dt
(progn
(redraw dt 3)
(setq diem (getpoint "\nVao diem chat: "))
(redraw dt 4)
)
)
(if (and dt diem)
(command ".break" dt diem diem)
)
)
  • 0

#5 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 18 February 2011 - 02:46 PM

Bạn thêm vòng while vào nt :
(Vì bạn k nói click cái j multi , tốt nhất là xác định lại đối tượng bị chặt ^^)

(defun c:bf (/ dt diem)
(while
(setq dt (car (entsel "\nVao doi tuong can chat")))
(if dt
(progn
(redraw dt 3)
(setq diem (getpoint "\nVao diem chat: "))
(redraw dt 4)
)
)
(if (and dt diem)
(command ".break" dt diem diem)
)
);end while
)

  • 0

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


#6 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1435 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 18 February 2011 - 02:49 PM

Cám ơn về lisp breakall này...còn cái lisp chặt điểm có ai nâng cấp nó thành multil click không...
(defun c:bf (/ dt diem)
(setq dt (car (entsel "\nVao doi tuong can chat")))
(if dt
(progn
(redraw dt 3)
(setq diem (getpoint "\nVao diem chat: "))
(redraw dt 4)
)
)
(if (and dt diem)
(command ".break" dt diem diem)
)
)

Phải thế này không ?
(defun c:bf (/ dt diem)
(if (setq dt (car (entsel "\nChon doi tuong can chat")))
(progn
(redraw dt 3)
(while (setq diem (getpoint "\nChon diem chat: "))
(command ".break" dt diem diem)
(redraw dt 3))
(redraw dt 4))))

  • 1

#7 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 18 February 2011 - 02:57 PM

Ý, bác Bach chưa test naz ^^ Chặt ra thành 2 thằng rồi thì còn thằng dt nữa đâu ạ ^^ E định lấy entlast nhưng mà nó lại khù khoằm hơn, tốt nhất cứ để chọn lại, vừa chuẩn mà cũng k lâu hơn mấy
  • 0

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


#8 almodeus

almodeus

    biết vẽ arc

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

Đã gửi 18 February 2011 - 03:13 PM

Phải thế này không ?

(defun c:bf (/ dt diem)
(if (setq dt (car (entsel "\nChon doi tuong can chat")))
(progn
(redraw dt 3)
(while (setq diem (getpoint "\nChon diem chat: "))
(command ".break" dt diem diem)
(redraw dt 3))
(redraw dt 4))))

của giabach nếu thêm được việc chọn đối tượng can chat là Multil thì hay
  • 0

#9 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1435 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 18 February 2011 - 03:30 PM

Ý, bác Bach chưa test naz ^^ Chặt ra thành 2 thằng rồi thì còn thằng dt nữa đâu ạ ^^ E định lấy entlast nhưng mà nó lại khù khoằm hơn, tốt nhất cứ để chọn lại, vừa chuẩn mà cũng k lâu hơn mấy

Còn đó chứ chạy đi đâu đuợc.
Có điều nó có còn là thằng mình muốn "chặt" nữa không thôi?! (xác xuất 50-50)
Nếu không phải thì enter : chọn lại.

của giabach nếu thêm được việc chọn đối tượng can chat là Multil thì hay

Đã có thằng "Break All" lo chuyện này rùi.
  • 0

#10 almodeus

almodeus

    biết vẽ arc

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

Đã gửi 18 February 2011 - 04:02 PM

Còn đó chứ chạy đi đâu đuợc.
Có điều nó có còn là thằng mình muốn "chặt" nữa không thôi?! (xác xuất 50-50)
Nếu không phải thì enter : chọn lại.


Đã có thằng "Break All" lo chuyện này rùi.

breakall thì chặt theo đối tượng giao, mình muốn chặt break tại điểm bất kì mah, giabach co the them cai lua chon doi tuong bi break la multil ko...cam on
  • 0

#11 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 18 February 2011 - 09:03 PM

Còn đó chứ chạy đi đâu đuợc.
Có điều nó có còn là thằng mình muốn "chặt" nữa không thôi?! (xác xuất 50-50)
Nếu không phải thì enter : chọn lại.


Hề hề, lúc đó nó đã bị xử thành 1nửa cuối thằng đầu rồi, và đúng là xác xuất 50 - 50, thế nên ở cái đầu e để chọn lại liên tiếp ^^

breakall thì chặt theo đối tượng giao, mình muốn chặt break tại điểm bất kì mah, giabach co the them cai lua chon doi tuong bi break la multil ko...cam on

Bạn đã tính đến việc lisp xử lý ntn khi bạn chọn nhiều đối tượng, sau đó quay lại chọn điểm, thì lisp sẽ làm cách nào để xác định điểm đó thuộc đối tượng nào trong đống đối tượng trước đó bạn chọn không ?? Nhất là trường hợp điểm đó lại là giao của 2/nhiều đối tượng, break theo thằng nào ??
Vẫn biết là lisp giúp xử lý công việc nhanh, nhưng mình nghĩ bạn cũng đừng quá lạm dụng request mà đến mức Lãn Ông quá.. Liệu có quá lâu nếu thêm 1 dấu cách sau khi đã kick nhiều điểm chặt ?
  • 0

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


#12 almodeus

almodeus

    biết vẽ arc

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

Đã gửi 20 February 2011 - 05:43 PM

Hề hề, lúc đó nó đã bị xử thành 1nửa cuối thằng đầu rồi, và đúng là xác xuất 50 - 50, thế nên ở cái đầu e để chọn lại liên tiếp ^^


Bạn đã tính đến việc lisp xử lý ntn khi bạn chọn nhiều đối tượng, sau đó quay lại chọn điểm, thì lisp sẽ làm cách nào để xác định điểm đó thuộc đối tượng nào trong đống đối tượng trước đó bạn chọn không ?? Nhất là trường hợp điểm đó lại là giao của 2/nhiều đối tượng, break theo thằng nào ??
Vẫn biết là lisp giúp xử lý công việc nhanh, nhưng mình nghĩ bạn cũng đừng quá lạm dụng request mà đến mức Lãn Ông quá.. Liệu có quá lâu nếu thêm 1 dấu cách sau khi đã kick nhiều điểm chặt ?

Bạn két xù...thì mình click tại điểm nằm trên đối tượng nào thì chỗ đó sẽ break thôi, chứ nếu điểm đó không nằm trên đối tượng đó thì làm sao break hả bạn...Nếu là điểm giao hay nhiều đối tượng thì nếu là nằm trên đối tượng chọn thì nó break hết...ví dụ 3 đường giao nhau tai A...ta chỉ chọn 2 đường, thì break chỉ trên hai đường tại A thôi...
Lisp gia bach sau khi break thi no se loai di doi mot doi tuong duoc tach ra, va chi con lai doi tuong duoc chon theo diem dau cuoi cua doi tuong...co cach nao la sau khi break thi che do select van la nhu ban dau khong ban, tuc luc break mot diem thi se co hai doi tuong nhung hai doi tuong do van dang duoc lua chon chu khong bi loai di mot trong hai, va cu nhu the
  • -1

#13 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 20 February 2011 - 06:22 PM

Bạn két xù...thì mình click tại điểm nằm trên đối tượng nào thì chỗ đó sẽ break thôi, chứ nếu điểm đó không nằm trên đối tượng đó thì làm sao break hả bạn...Nếu là điểm giao hay nhiều đối tượng thì nếu là nằm trên đối tượng chọn thì nó break hết...ví dụ 3 đường giao nhau tai A...ta chỉ chọn 2 đường, thì break chỉ trên hai đường tại A thôi...
Lisp gia bach sau khi break thi no se loai di doi mot doi tuong duoc tach ra, va chi con lai doi tuong duoc chon theo diem dau cuoi cua doi tuong...co cach nao la sau khi break thi che do select van la nhu ban dau khong ban, tuc luc break mot diem thi se co hai doi tuong nhung hai doi tuong do van dang duoc lua chon chu khong bi loai di mot trong hai, va cu nhu the

Yêu cầu bạn viết toàn bộ chữ có dấu. Bạn viết chữ có dấu, chữ không có dấu thế này thì Có tôn trọng người đọc bài viết của bạn không? Có tôn trọng bạn Ketxu đã Reply bài viết của bạn không? Có tôn trọng những người đã trả lời cho bạn trong bài viết này không? Có vi phạm nội quy của CADVIET hay không?

Thể lệ tham gia cadviet
1. Không làm những việc trái với pháp luật nước Việt Nam.
2. Không làm những việc trái với lương tâm của bạn.
3. Sử dụng tiếng Việt có dấu khi post bài và không reply bài không có dấu.
4. Sử dụng chức năng search để tránh post lặp nội dung đã có.
5. Nhận lời cảm ơn của cadviet.
  • 1

#14 lanvientkh

lanvientkh

    biết vẽ arc

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

Đã gửi 04 August 2016 - 01:32 PM

Dear các bạn

Mình vào diễn đàn để tìm cái lisp cắt line giao nhau mãi mà ko có cái đúng ý mình, nhờ các bạn giúp mình với.

Mình hay vẽ với các line, pline giao nhau do đó mình phải vẽ line này băng qua line giao nhau bằng một Cung tròn rồi sau đó Trim lại rất lâu và mất thời gian

Mình nhờ các bạn có thể viết giúp lisp theo yêu cầu như của mình được không với các yêu cầu sau:

1.     Cung tròn (ARC) băng qua line hay pline giao nhau có bán kính tự chọn, sau khi chọn có thể thay đổi được bán kính này nếu đường cong tròn (ARC) quá to hay quá nhỏ

2.     Lisp có thể chọn được từng Line, Pline hoặc chọn được cả một nhóm line giao nhau

cảm ơn các bạn

 

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


  • 0