Đến nội dung


Hình ảnh

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


  • Please log in to reply
28 replies to this topic

#1 dnhqs

dnhqs

    biết vẽ ellipse

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

Đã gửi 07 April 2008 - 08:58 AM

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

#2 vndesperados

vndesperados

    biết lệnh xref

  • Members
  • PipPipPipPipPipPipPip
  • 547 Bài viết
Điểm đánh giá: 253 (khá)

Đã gửi 07 April 2008 - 09:09 AM

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

#3 dnhqs

dnhqs

    biết vẽ ellipse

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

Đã gửi 07 April 2008 - 11:05 AM

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

#4 vndesperados

vndesperados

    biết lệnh xref

  • Members
  • PipPipPipPipPipPipPip
  • 547 Bài viết
Điểm đánh giá: 253 (khá)

Đã gửi 07 April 2008 - 11:27 AM

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

#5 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 07 April 2008 - 10:22 PM

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

  • 4

#6 dnhqs

dnhqs

    biết vẽ ellipse

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

Đã gửi 24 April 2008 - 10:20 AM

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

#7 duongsatdn

duongsatdn

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 1657 Bài viết
Điểm đánh giá: 761 (tốt)

Đã gửi 24 April 2008 - 11:17 AM

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ả(?)
  • 0

#8 NguyenNgocSon

NguyenNgocSon

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 368 Bài viết
Điểm đánh giá: 39 (tàm tạm)

Đã gửi 14 November 2012 - 04:23 PM

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

#9 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 14 November 2012 - 04:38 PM

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


#10 NguyenNgocSon

NguyenNgocSon

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 368 Bài viết
Điểm đánh giá: 39 (tàm tạm)

Đã gửi 14 November 2012 - 04:51 PM

bác có thể cho luôn vào code không? Tôi chưa rõ lắm !
Cám ơn !
  • 0

#11 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 14 November 2012 - 05:01 PM

Tại sao lại break ra rồi jion lại để làm chi vậy?
  • 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.


#12 NguyenNgocSon

NguyenNgocSon

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 368 Bài viết
Điểm đánh giá: 39 (tàm tạm)

Đã gửi 14 November 2012 - 05:06 PM

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

#13 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 14 November 2012 - 05:08 PM

OK. Tối về nếu ai chưa giúp bạn thì tôi sẽ giúp.
  • 1

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


#14 NguyenNgocSon

NguyenNgocSon

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 368 Bài viết
Điểm đánh giá: 39 (tàm tạm)

Đã gửi 14 November 2012 - 05:10 PM

Thực ra mình cũng đang lượm code gần giống để chế mà chưa được
Cám ơn!
  • 0

#15 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 14 November 2012 - 08:38 PM

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


#16 NguyenNgocSon

NguyenNgocSon

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 368 Bài viết
Điểm đánh giá: 39 (tàm tạm)

Đã gửi 14 November 2012 - 08:56 PM

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

#17 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 14 November 2012 - 09:34 PM

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

  • 1

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


#18 NguyenNgocSon

NguyenNgocSon

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 368 Bài viết
Điểm đánh giá: 39 (tàm tạm)

Đã gửi 15 November 2012 - 09:02 AM

Cám ơn bạn.Like sau giờ không like được (báo lỗi) :D
  • 0

#19 LoveLisp

LoveLisp

    biết lệnh extend

  • Members
  • PipPipPip
  • 195 Bài viết
Điểm đánh giá: 20 (tàm tạm)

Đã gửi 15 November 2012 - 09:03 AM

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

Hình đã gửi
Xin lỗi, để ảnh to quá!!
  • 0

#20 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 15 November 2012 - 09:19 AM

Đượ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!
  • 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.