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.
dnhqs

cắt pline thành các đoạn theo chiểu dài chọn

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

dnhqs    6

giả tỉ mình có 1 pline gồm các cung và các đường thẳng mình muốn cắt thằng này thành nhiều đoạn có kích thước do mình chọn (điều kiện được cắt phải nhỏ hơn chiều dài pline còn lại) lưu ý phân đoạn được cắt ra có thể có cả đường cong và đường thẳng miễm là list hắn lên có chiều dài mong muố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
vndesperados    253
giả tỉ mình có 1 pline gồm các cung và các đường thẳng mình muốn cắt thằng này thành nhiều đoạn có kích thước do mình chọn (điều kiện được cắt phải nhỏ hơn chiều dài pline còn lại) lưu ý phân đoạn được cắt ra có thể có cả đường cong và đường thẳng miễm là list hắn lên có chiều dài mong muốn

Cắt ra từng đọan để làm gì??? Bạn phải nói rõ mục đích để mọi người xem có đáng để làm không.

Còn muốn phân đọan thì có thể dùng Measure hoặc Devide

  • 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
dnhqs    6
Cắt ra từng đọan để làm gì??? Bạn phải nói rõ mục đích để mọi người xem có đáng để làm không.

Còn muốn phân đọan thì có thể dùng Measure hoặc Devide

mình biết me và div rồi!

thực ra đây là cách cắt pline ra nhiều đoạn có kích thước định trứoc nhưng không bằng nhau

ví dụ có liêu quan đến measure:

gõ lệnh: me

click vào pline

gõ 4000 (chẳng hạn)

tiếp tục dùng lệnh br

click vào pline

chọn truy bắt điểm (node) bấm f rồi click vào điểm chia đầu tiên

thế là được pline 1

sau đó xóa bọn điểm do me tạo ra

rồi tiếp tục chia "cho đến khi thuộc lòng"

túm lại

chia pline pl thành pl1 ... pln có kích thước khác nhau

nếu chưa rõ mình sẽ giải thích thêm - mình rất cần gấp

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
vndesperados    253
mình biết me và div rồi!

thực ra đây là cách cắt pline ra nhiều đoạn có kích thước định trứoc nhưng không bằng nhau

ví dụ có liêu quan đến measure:

gõ lệnh: me

click vào pline

gõ 4000 (chẳng hạn)

tiếp tục dùng lệnh br

click vào pline

chọn truy bắt điểm (node) bấm f rồi click vào điểm chia đầu tiên

thế là được pline 1

sau đó xóa bọn điểm do me tạo ra

rồi tiếp tục chia "cho đến khi thuộc lòng"

túm lại

chia pline pl thành pl1 ... pln có kích thước khác nhau

nếu chưa rõ mình sẽ giải thích thêm - mình rất cần gấp

 

Đây là một bài tóan tương đối khó. Bài này giải quyết mất khỏang 16h và khỏang 100 dòng code. Chỉ để giải quyết một bài tóan nếu làm bằng tay vẫn được và chỉ phục vụ cho một người. :bigsmile:

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
Nguyen Hoanh    4.524
Đây là một bài tóan tương đối khó. Bài này giải quyết mất khỏang 16h và khỏang 100 dòng code. Chỉ để giải quyết một bài tóan nếu làm bằng tay vẫn được và chỉ phục vụ cho một người. :bigsmile:

16h ~ 100 dòng code, vị chi là 16*60/100 = mất 9.6 phút cho 1 dòng code, hơi bị lâu hén. Đùa tí thôi, định trả lời bài này giống vndesperados, nhưng vndes đã trả lời vậy rồi, mình trả lời giống lại thành spam bài kiểu Jikibo. Đành phải trả lời khác vậy.

 

Lệnh CHIA dưới đây sẽ làm điều dnhqs muốn (measure sau đó thì break một cách tự động):

(defun c:chia( / ent kc oldos)
 (defun findp(ent)
   (vlax-curve-getPointAtDist ent kc)
 )
 (setq ent (car (entsel "\nVao doi tuong: "))
kc (getdist "\nVAo khoang cach: ")
oldos (getvar "osmode")
 )
 (setvar "osmode" 0)
 (while (and (setq p (findp ent)) (not (equal p oldp 0.01)))
   (command ".break" ent p p)
   (setq ent (entlast)
  oldp p)
 )
 (setvar "osmode" oldos)
 (princ)
)

  • Vote tăng 4

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
dnhqs    6
16h ~ 100 dòng code, vị chi là 16*60/100 = mất 9.6 phút cho 1 dòng code, hơi bị lâu hén. Đùa tí thôi, định trả lời bài này giống vndesperados, nhưng vndes đã trả lời vậy rồi, mình trả lời giống lại thành spam bài kiểu Jikibo. Đành phải trả lời khác vậy.

 

Lệnh CHIA dưới đây sẽ làm điều dnhqs muốn (measure sau đó thì break một cách tự động):

(defun c:chia( / ent kc oldos)
 (defun findp(ent)
   (vlax-curve-getPointAtDist ent kc)
 )
 (setq ent (car (entsel "\nVao doi tuong: "))
kc (getdist "\nVAo khoang cach: ")
oldos (getvar "osmode")
 )
 (setvar "osmode" 0)
 (while (and (setq p (findp ent)) (not (equal p oldp 0.01)))
   (command ".break" ent p p)
   (setq ent (entlast)
  oldp p)
 )
 (setvar "osmode" oldos)
 (princ)
)

 

hổng chịu chạy

 

Command: ap

APPLOAD ChiaPLine.lsp successfully loaded.

 

 

Command:

Command:

Command: chia

 

Vao doi tuong:

VAo khoang cach: 200

; error: no function definition: VLAX-CURVE-GETPOINTATDIST

 

Command:

Command:

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
duongsatdn    762

Tôi cũng chỉ thấy đoạn

Command: chia

 

Vao doi tuong:

VAo khoang cach: 200

Command:

Xong chẳng thấy chuyện gì xảy ra 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

16h ~ 100 dòng code, vị chi là 16*60/100 = mất 9.6 phút cho 1 dòng code, hơi bị lâu hén. Đùa tí thôi, định trả lời bài này giống vndesperados, nhưng vndes đã trả lời vậy rồi, mình trả lời giống lại thành spam bài kiểu Jikibo. Đành phải trả lời khác vậy.

 

Lệnh CHIA dưới đây sẽ làm điều dnhqs muốn (measure sau đó thì break một cách tự động):

(defun c:chia( / ent kc oldos)  (defun findp(ent)    (vlax-curve-getPointAtDist ent kc)  )  (setq ent (car (entsel "\nVao doi tuong: "))	kc (getdist "\nVAo khoang cach: ")	oldos (getvar "osmode")  )  (setvar "osmode" 0)  (while (and (setq p (findp ent)) (not (equal p oldp 0.01)))    (command ".break" ent p p)    (setq ent (entlast)  	oldp p)  )  (setvar "osmode" oldos)  (princ))

Các bác cho hỏi thêm đoạn code nào để sau khi chia Lisp tự nối các đoạn thành PL (Nghĩa là PL để chia không bị break)

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
Doan Van Ha    2.678

Không thể dùng chỉ 1 dòng code để nối chúng lại được. Muốn nối bạn phải hứng được các đối tượng sinh ra sau lệnh break, ví dụ được tập chọn ss, khi đó mới dùng:

 

(if (member objType '("LINE" "ARC"))

(command "_.pedit" "_M" ss "" "_Y" "_J" "_J" "_B" fuzz "")

(command "_.pedit" "_M" ss "" "_J" "_J" "_B" fuzz ""))))

  • 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

Tại sao lại break ra rồi jion lại để làm chi vậy?

Thực ra mình thấy lisp này đáp ứng được cv của mình nhưng chưa Join lại thôi

Bài toán gốc của mình là như sau:

"Cho đối tượng là LWPL, bây giờ tôi muốn nhập khoảng cách chia là L=? nhập vào. Sau đó lisp tự động thêm các đỉnh tại các khoảng cách nhập vào đó.L<=Chiều dài LWPL. Ví dụ: LWPL=50, nhập L=15 thì tự thêm 3 đỉnh tại các KC là:15,30,45 (Nếu thêm tính năng chèn Block tại các điểm này nữa thì tuyểt-Block quay vuông góc với LWPL)"

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
Doan Van Ha    2.678

Thực ra mình thấy lisp này đáp ứng được cv của mình nhưng chưa Join lại thôi

Bài toán gốc của mình là như sau:

"Cho đối tượng là LWPL, bây giờ tôi muốn nhập khoảng cách chia là L=? nhập vào. Sau đó lisp tự động thêm các đỉnh tại các khoảng cách nhập vào đó.L<=Chiều dài LWPL. Ví dụ: LWPL=50, nhập L=15 thì tự thêm 3 đỉnh tại các KC là:15,30,45 (Nếu thêm tính năng chèn Block tại các điểm này nữa thì tuyểt-Block quay vuông góc với LWPL)"

Cám ơn!

Giờ đọc lại y/c thì thấy bạn chỉ cần dùng lệnh measure là được mà, cần gì 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

Cám ơn bạn.Measure mình biết rồi mà

Cái chính là mình muốn : "Cho đối tượng là LWPL, bây giờ tôi muốn nhập khoảng cách chia là L=? nhập vào. Sau đó lisp tự động thêm các đỉnh tại các khoảng cách nhập vào đó.L<=Chiều dài LWPL. Ví dụ: LWPL=50, nhập L=15 thì tự thêm 3 đỉnh tại các KC là:15,30,45.Là chính

Measure không tạo thêm đỉnh tại vị trí add.

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
Doan Van Ha    2.678

Lisp thêm đỉnh cho Lwpolyline bằng cách chia nó thành các đoạn có khoảng cách cho trước.

(defun c:chia( / ent kc oldos)
(defun findp(ent)
 (vlax-curve-getPointAtDist ent kc))
(setq ent (car (entsel "\nVao doi tuong: "))
      	kc (getdist "\nVAo khoang cach: ")
      	oldos (getvar "osmode")
      	ss (ssadd ent))
(setvar "osmode" 0)
(while (and (setq p (findp ent)) (not (equal p oldp 0.01)))
 (command ".break" ent p p)
 (setq ent (entlast) oldp p ss (ssadd ent ss)))
(command "_.pedit" "m" ss "" "j" "j" "b" 1E-8 "")
(setvar "osmode" oldos)
(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
LoveLisp    20

Tiện đây, cũng gần với chủ đề này, mình muốn chỉ định 2 điểm d1 và d2 cắt qua tất cả các đối tượng còn lại, cắt chúng ra làm 2 đoạn tại các điểm giao với đường d1d2. Có làm được không nhỉ các bác??

 

99835_cutby2point.png

Xin lỗi, để ảnh to quá!!

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
Doan Van Ha    2.678

Được bạn à! Và cách làm như sau:

- ssget với "fence" là d1 và d2, được tập chọn ss.

- Vẽ Line L nối d1 và d2.

- Duyệt qua từng phần tử của ss. Với mỗi phần tử: tìm giao của nó với L, được điểm Px.

- Break phần tử đó tại Px, được 2 phần.

- Cuối cùng, mượn thì phải trả: xóa L.

Chúc bạn thành cô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
LoveLisp    20

Mấu chốt nằm ở chỗ "tìm giao của nó với L" bác Hà ạ! Đường thẳng thì dễ, có thể dùng hàm (inters để xác định, nhưng các Arc, Elip, Spline, Pline có đoạn cong thì xác định như thế nào, bác có thể hướng dẫn đượ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
Doan Van Ha    2.678

Hàm tìm giao điểm của 2 vla-object:

(vlax-invoke obj1 'IntersectWith obj2 acExtendNone)

; - acExtendNone Does not extend either object.

; - acExtendThisEntity Extends the Fst object.

; - acExtendOtherEntity Extends the Nxt object.

; - acExtendBoth Extends both objects.

Hoặc nếu dùng acet thì:

(acet-geom-intersectwith en1 en2 flag)

Hàm trả về listpoint tọa độ các điểm giao của 2 đối tượng en1 en2. Flag là số interger, cờ quy định các kiểu giao:

0: không mở rộng 2 đối tượng en1, en2

1: mở rộng đối tượng en1, không mở rộng đối tượng en2.

2: không mở rộng đối tượng en1, mở rộng đối tượng en2.

3: mở rộng 2 đối tượng en1 en2

  • 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
LoveLisp    20

Cám ơn bác Hà rất nhiều! Mình đã viết thử theo hướng dẫn của bác và nó chạy ngon lành. Tuy nhiên, phần trợ giúp của VLisp (trên cad2007) chỉ có hàm (vlax-invoke-method thôi, còn hàm (vlax-invoke nó vẫn thực thi và vẫn đổi thành màu xanh như các hàm khác mà không có phần trợ giúp, vì vậy mình không tìm được cách dùng của (vlax-invoke.

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
Doan Van Ha    2.678

Cách nào cũng được cả!

Giao của ent1 và ent2:

(vlax-invoke (vlax-ename->vla-object ent1) 'IntersectWith (vlax-ename->vla-object ent2) 0)

Love Lisp, but not love "Like This"! :D

  • 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
LoveLisp    20

so sorry!!! :)) Mình vừa "Like This" hết hạn mức ngày hôm nay lun!!

Mình đã viết một đoạn lisp như sau:

;Chon cac doi tuong
;va pick 2 diem
;Cac doi tuong se bi ngat tai giao voi duong thang noi 2 diem
(defun c:br2p(/ chon d1 d2 ename-s1 vla-name-s1 dem kind vla-name-s2 inter)
 (command ".ucs" "w" ".undo" "e" ".undo" "be")
 (vl-load-com)
 (princ "\nSelect objects to break: ")
 (if (setq chon (ssget))
(if (setq d1 (getpoint "\nBreak line from: "))
 	(if (setq d2 (getpoint d1 "\nBreak line to: "))
(progn
  (command ".line" d1 d2 "")
  (setq ename-s1 (entlast)
 vla-name-s1 (vlax-ename->vla-object (entlast)))

  (setq dem 0)
  (while (< dem (sslength chon))
(progn
  	(setq kind (cdr (assoc 0 (entget (ssname chon dem)))))
  	(if (member kind (list "LINE" "POLYLINE" "LWPOLYLINE" "ARC" "SPLINE" "RAY" "XLINE"))
 (progn
(setq vla-name-s2 (vlax-ename->vla-object (ssname chon dem))
  inter   	(vlax-invoke vla-name-s1 'IntersectWith vla-name-s2 acExtendNone))
(command ".break" (ssname chon dem) inter inter)
)
 (progn
(setq notify (strcat "\n" kind " cannot break!"))
(princ notify)));if
  	(setq dem (1+ dem))
  	));while
  (command ".erase" ename-s1 "")
  ))));if
 (command ".undo" "e")
 (princ))

Mình muốn mở rộng nó ra cho CIRCLE, ELLIPSE, MLINE nữa nhưng chưa biết làm thế nào.

Lệnh này cũng không có tác dụng đối với ARC nếu như nó cắt ARC nhiều hơn một lầ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

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


×