Chuyển đến nội dung
Diễn đàn CADViet
thanhlong.hygt

Lisp thêm đỉnh pline tại giao điểm của pline và các line khác

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

Mình đã tìm mấy ngày trên diễn đàn cái lisp có chức năng như thế này mà chưa có. Bác nào lỡ ghé qua đọc rồi nếu có thì cho e xin với. Nếu không có thì cũng cái đá đít để e lên top đầu ạ. thank all

 

Chức năng lisp cần tìm.

Có 1 pline A giao với nhiều đường line và pline khác.==> kết quả sau khi chạy lisp là thêm đỉnh cho pline A tại các giao điểm trên

  • Vote giảm 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

Đã vote cho bác. thank bác ạ. Lisp đó e đã tải về dùng và có biết nó rồi ạ. Nhưng nó chưa automatic cho lắm. phải pick từng cái một. E nghĩ trên diễn đàn đã có nhiều bác giải được thuật toán tìm giao giữa các đối tượng với pline rồi. Nhưng chưa tìm thấy lisp chọn pline cần thêm đỉnh, chọn các đối tượng giao với pline==> kết quả pline tự động chèn thêm các đỉnh ở vị trí giao với các đối tượng khác. E tìm hoài mà cũng chưa thấy. Mong các bác giúp ạ. 

Mà bác cho e hỏi với. sao nick e danh tiếng lại là âm 3 bác nhỉ. e có hư chửu hay cãi nhau ai bao giờ đâu. Có phải mỗi lần e thank người khác là danh tiếng e  giảm đi lên âm phải không bá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

Đã vote cho bác. thank bác ạ. Lisp đó e đã tải về dùng và có biết nó rồi ạ. Nhưng nó chưa automatic cho lắm. phải pick từng cái một. E nghĩ trên diễn đàn đã có nhiều bác giải được thuật toán tìm giao giữa các đối tượng với pline rồi. Nhưng chưa tìm thấy lisp chọn pline cần thêm đỉnh, chọn các đối tượng giao với pline==> kết quả pline tự động chèn thêm các đỉnh ở vị trí giao với các đối tượng khác. E tìm hoài mà cũng chưa thấy. Mong các bác giúp ạ. 

Mà bác cho e hỏi với. sao nick e danh tiếng lại là âm 3 bác nhỉ. e có hư chửu hay cãi nhau ai bao giờ đâu. Có phải mỗi lần e thank người khác là danh tiếng e  giảm đi lên âm phải không bác

Trả lời cái đỏ đỏ này chỉ là đoán mò thôi. Các lý do có thể có là:

1). Có văn hóa kém trên forum. Bạn không có thì thôi.

2). Hỏi ngớ ngẩn, hỏi thiếu dữ liệu, hỏi ngô nghê v.v...

3). Chảnh chọe...

4). v.v...

Nói chung là comment mà người đọc thấy ngứa mắt ngứa tai thì họ cũng hay cho 1 điểm trừ.

Không có chuyện thanks mà âm đâu.

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

Đã vote cho bác. thank bác ạ. Lisp đó e đã tải về dùng và có biết nó rồi ạ. Nhưng nó chưa automatic cho lắm. phải pick từng cái một. E nghĩ trên diễn đàn đã có nhiều bác giải được thuật toán tìm giao giữa các đối tượng với pline rồi. Nhưng chưa tìm thấy lisp chọn pline cần thêm đỉnh, chọn các đối tượng giao với pline==> kết quả pline tự động chèn thêm các đỉnh ở vị trí giao với các đối tượng khác. E tìm hoài mà cũng chưa thấy. Mong các bác giúp ạ. 

Mà bác cho e hỏi với. sao nick e danh tiếng lại là âm 3 bác nhỉ. e có hư chửu hay cãi nhau ai bao giờ đâu. Có phải mỗi lần e thank người khác là danh tiếng e  giảm đi lên âm phải không bác

Hề hề hề,

Cái danh tiếng này có quan trọng gì với bạn không nhể???

Nếu không thì bạn cũng chả cần quan tâm tới mần chi.

Nếu có thì bạn cần tự kiểm tra lại các bài đã post của mình, và so sánh nó với các quy định của diễn đàn, cũng như các bài post của mọi người có liên quan tới các bài post của bạn. Từ đó bạn sẽ hiểu ra và có cách khắc phục nó đ6ẻ cái danh tiếng ấy nó to lên.

Thú thực là cho đến cái bài post mới nhất của bạn, bạn vẫn chả hề quan tâm tới các yêu cầu chung khi tham gia diễn đàn, đặc biệt là các bài post có yêu cầu về lisp. Bạn vẫn chỉ thể hiện sự thiếu tôn trọng mọi người mà chỉ biết quăng cái yêu cầu của mình lên mặc dầu nó chưa thể hiện hết những điều bạn cần. Và chắc chắn nếu ai đó viết cái lisp này sẽ phải tự đoán mò để hiểu thêm và như vậy thì cũng chưa chắc gì đáp ứng đúng yêu cầu của bạn.

Bạn có hiểu và thông cảm nổi với những người muốn giúp bạn hay không, hay bạn cho rằng chỉ  có mọi người cần hiểu, thông cảm và phải có nghĩa vụ giúp đỡ bạn????

Những điều đó có lẽ là nguyên nhân chính khiến bạn có được cái danh tiếng không mấy ưa thích như trên đấy bạn ạ.

Hy vọng rằng bạn sẽ cải thiện được cái danh tiếng của mình nếu bạn muốn.

Mình cũng xin nói thêm rằng nếu bạn không thể cải thiện cách trình bày các yêu cầu cá nhân của mình trên diễn đàn này thì sẽ có lúc các bài post của bạn sẽ bị xóa đấy. Đó là quy định của diễn đàn mà. Về các quy định của diễn đàn, bạn nên tham khảo kỹ, đặc biệt là các quy định khi post các yêu cầu về lisp bởi các lisper trên diễn đàn này đều khá ..... dễ tính bạn ạ.

Hề hề hề,......

  • 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

Thank hai bác vì câu trả lời trên. E thấy diễn đàn này khá tốt và giúp ích cho mình khá nhiều. Nên sau này sẽ bớt chút thời gian đọc cái nội quy của diễn đàn. Trước đây có lẽ là do chỉ quan tâm tới tài liệu chia sẻ trên các diễn đàn nên e k hay chú ý mấy. E tính hay hài hước nhưng lại k có kiến thức lisp nên chắc không được vote bằng cách giúp đỡ ai đó rồi. Thôi chịu khó comment hài hước tý để kiếm cái thank để cái biểu tượng danh tiếng nó mầu xanh hoà bình cái, chứ nó mầu đỏ chiến tranh vậy sợ quá

  • Vote giảm 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

Hu hu ! Chưa kịp sửa bài viết mà lại bị trừ một điểm nữa. Mà oan uổng quá nhỉ, E nghĩ Dữ liệu e post khá đầy đủ mà. Bác nào đọc mà thấy e đúng thì thương e cho e 1vote ở nút mầu xanh nhé.K thíck cái mầu đỏ tý nào

  • Vote tăng 1
  • Vote giảm 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

up lên xem có bác nào có thì cho e xin. Mong được sự giúp đỡ

Hề hề hề,

Bạn vẫn muốn người giúp phải đoán mò hay sao??? nếu bạn không chịu up cái bản vẽ thể hiện điều bạn cần lên thì có nhẽ mùa quít sang năm chửa chắc đã có trái đâu....

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

Mình đã tìm mấy ngày trên diễn đàn cái lisp có chức năng như thế này mà chưa có. Bác nào lỡ ghé qua đọc rồi nếu có thì cho e xin với. Nếu không có thì cũng cái đá đít để e lên top đầu ạ. thank all

 

Chức năng lisp cần tìm.

Có 1 pline A giao với nhiều đường line và pline khác.==> kết quả sau khi chạy lisp là thêm đỉnh cho pline A tại các giao điểm trên

Dùng command của cad thì không hay lắm, nhưng đọc các code khác dài quá nên thôi.

Tôi chỉ viết phần chính. Bạn tự thêm vào bẫy lỗi hoặc xử lý các điểm gần trùng nhau, trùng với đỉnh của pline

 

(defun AppendLs (ls e)(append (if ls ls nil) (list e)))
(defun ObjInters (o1 o2 id / g ps n)
    (setq    g    (vlax-invoke o1 'IntersectWith o2 id)    ps '())
    (while g (setq    ps (AppendLs ps (list (car g) (cadr g) (caddr g))) g (cdddr g))    )    ps
)

(defun C:II ( / sp ls lp lq li o s p m n ob om ss x s3) ; Insert vertex at intersections
    (setq om (getvar "OSMODE")) (setvar "OSMODE" 0)
    (princ "Chon pline:")    (setq ss (ssget ":S") ob (vlax-ename->vla-object (ssname ss 0)) )
    (princ "Chon cac duong giao:")
    (setq ls (mapcar 'vlax-ename->vla-object
                                     (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget '((0 . "*LINE")(8 . "ENTCOC"))))))))
    (setq s3 (if (wcmatch (vlax-get-property ob 'ObjectName) "*3d*") " \"N\"" ""))
    (foreach o ls
        (setq lp (append lp (ObjInters ob o acExtendNone)))    )
    (setq lq (mapcar '(lambda (x) (vlax-curve-getParamAtPoint ob (vlax-curve-getClosestPointTo ob x))) lp))
    (setq n 0 li (vl-sort-i lq '<) s "")
    (foreach p li
        (setq m (fix (nth p lq)))
        (repeat (- m n)
            (setq s (strcat s " \"N\""))    )
        (setq s (strcat s " \"I\" (nth " (itoa p) " lp)" s3) n m)
    )
    (vl-cmdf "ZOOM" "E")
    (eval (read (strcat "(vl-cmdf \"PEDIT\" ss \"E\"" s "\"X\" \"\")")) )
    (setvar "OSMODE" om)
)
  • 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

Thank các bác nhé.

Thank bác "ndtnv" ạ. Bác có thể giúp e cho chót không. e không  được hiểu về lisp cho lắm.

E đã tìm trên diễn đàn nước ngoài có được lisp break đối tượng tại tất cả vị trí giao nhau rồi nối lại. Cái này thủ công hơn một công đoạn nhưng điều quan trọng là vẫn chưa giải quyết được bài toán nếu có hai đối tượng giao cùng 1 điểm với đường pline thì cách làm trên chỉ tạo thêm được một đỉnh lại vị trí giao. Mong được các bác giúp. em sẽ nghĩ và viết lại yêu cầu để mọi người dễ hiểu. sorry nếu dữ liệu của e thiếu.

- Xin lỗi bác Bình vì e chưa sửa bài viết. Cũng tại e nghĩ vì các đối tượng giao nhau sẽ tạo ra một điểm giao nên e nghĩ yêu cầu đủ rồi lên không bổ sung. hì, e bổ sung luôn ạ

116735_chen_dinh.pnghttp://www.cadviet.com/upfiles/3/116735_chen_dinh.dwg

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

Thank các bác nhé.

Thank bác "ndtnv" ạ. Bác có thể giúp e cho chót không. e không  được hiểu về lisp cho lắm.

E đã tìm trên diễn đàn nước ngoài có được lisp break đối tượng tại tất cả vị trí giao nhau rồi nối lại. Cái này thủ công hơn một công đoạn nhưng điều quan trọng là vẫn chưa giải quyết được bài toán nếu có hai đối tượng giao cùng 1 điểm với đường pline thì cách làm trên chỉ tạo thêm được một đỉnh lại vị trí giao. Mong được các bác giúp. em sẽ nghĩ và viết lại yêu cầu để mọi người dễ hiểu. sorry nếu dữ liệu của e thiếu.

Đã edit lại code. Bạn down về dùng xem

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

mình đã tesp thử máy bảo lỗi bạn ạ. bạn xem giúp mình với

 

 

nếu pline cần thêm đỉnh là polyline thì báo lỗi

"Command: ii
Chon pline:
Select objects:
Chon cac duong giao:
Select objects: Specify opposite corner: 225 found

Select objects:  ZOOM
Specify corner of window, enter a scale factor (nX or nXP), or
[All/Center/Dynamic/Extents/Previous/Scale/Window/Object] <real time>: E
Command: II Unknown command "II".  Press F1 for help.

Command: ; error: bad argument value: does not fit in byte: 667"

 

 

Nếu pline cần thêm đỉnh là 2d polyline thì báo lỗi

"Command: ii

Chon pline:
Select objects:
Chon cac duong giao:
Select objects: Specify opposite corner: 125 found

Select objects:  ZOOM
Specify corner of window, enter a scale factor (nX or nXP), or
[All/Center/Dynamic/Extents/Previous/Scale/Window/Object] <real time>: E
Command: II Unknown command "II".  Press F1 for help.

Command: ; error: bad argument value: does not fit in byte: 458"

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

Sửa (vl-cmdf "ZOOM" "E" "") thành (vl-cmdf "ZOOM" "E"), Nếu không được thì bỏ dòng đó, khi dùng lệnh chọn các đường giao xong thì dùng mouse zoom sao cho nhìn thấy toàn bộ đường pline rồi mới enter xem.

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

Thank các bác nhé.

Thank bác "ndtnv" ạ. Bác có thể giúp e cho chót không. e không  được hiểu về lisp cho lắm.

E đã tìm trên diễn đàn nước ngoài có được lisp break đối tượng tại tất cả vị trí giao nhau rồi nối lại. Cái này thủ công hơn một công đoạn nhưng điều quan trọng là vẫn chưa giải quyết được bài toán nếu có hai đối tượng giao cùng 1 điểm với đường pline thì cách làm trên chỉ tạo thêm được một đỉnh lại vị trí giao. Mong được các bác giúp. em sẽ nghĩ và viết lại yêu cầu để mọi người dễ hiểu. sorry nếu dữ liệu của e thiếu.

- Xin lỗi bác Bình vì e chưa sửa bài viết. Cũng tại e nghĩ vì các đối tượng giao nhau sẽ tạo ra một điểm giao nên e nghĩ yêu cầu đủ rồi lên không bổ sung. hì, e bổ sung luôn ạ

http://www.cadviet.com/upfiles/3/116735_chen_dinh.dwg

Hề hề hề.

Như bạn đã thấy, nếu không gửi bản vẽ lên thì có giời mới biết phải làm như thế nào. Bản vẽ bạn gửi lên thì Polyline được cấu tạo là đối tượng Polyline chứ không phải Lwpolyline.

Vì thế khi break thì nó sẽ tạo ra hai polyline mới chứ không phải chỉ một polyline mới bạn ạ.

Mặt khác các đường cần lấy giao điểm của bạn là line chứ không phải polyline.

Lisp mình viết dưới đây dựa trên cấu trúc bản vẽ bạn gửi, Các đường giao với polyline cần thêm đỉnh là cácline thuộc layer "ENTCOC". Do vậy nếu sử dụng với các bản vẽ có cấu trúc khác thì mình không thể đảm bảo nó sẽ chạy dhuẩn. Riêng với bản vẽ bạn gửi lên thì mình đả test và kết quả là thêm được 139 đỉnh nữa ngoài số 160 đỉnh đả có. Đúng hay sai bạn hãy tự kiểm chứng nhé.

Lưu ý rằng sau khi lisp chạy xong thì đường polyline của bạn sẽ trở thành đường lwpolyline chứ không còn mang nguyên bản chất ban đầu của nó nữa bạn ạ.

Về sự khác nhau giữa hai loại đường này thì mình chỉ hiểu biết có hạn thôi. Chỉ biết rằng sau khi bạn break nó ra rồi joint lại thì nó tự chuyển thành lwpolyline .

Mong rằng lisp này sẽ giúp ích cho bạn ít nhiều và cũng mong rằng bạn sẽ lưu tâm hơn về cách trình bày vấn đề để người khác có thể hiểu yêu cầu đủ để giúp được bạn.

Nếu có gì bạn chưa ưng ý thì hãy post lên để mình xem lại.

http://www.cadviet.com/upfiles/3/5194_addvertexpolyline.lsp

  • 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

Thank bác Bình ạ. E đã test và kết quả lisp đã thêm được đỉnh ngon mà k lỗi j. Nhưng để nó tổng quát hơn e mong bác sửa giúp e một số yếu tố để kết quả nó như mong đợi ạ.

Trong bản vẽ yếu tố xác định giao là 225 line thuộc lỚp "ENTCOC" ===> Kết quả là 225 đỉnh

Bài toán như sau: Kiểm tra vị trí giao giữa đường pline và các line

    - Nếu vị trí giao không trùng vị trí 1 đỉnh nào của Pline thì thêm đỉnh tại vị trí giao (n line giao với pline tại cùng 1 vị trí cho ra n đỉnh tại điểm giao với Pline)

    - Nếu vị trí giao trùng vị trí 1 đỉnh nào của Pline thì xét tiếp n line giao với pline tại cùng 1 đỉnh cho ra n đỉnh tại vị trí đỉnh Pline)

 

+ Bác có thể giúp e bỏ điều kiện chỉ nhận các line thuộc lớp EnTcoc không ạ. Hoặc cách nào để lựa chọn Xác định line giao với pline theo lớp với ạ

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

Thank bác Bình ạ. E đã test và kết quả lisp đã thêm được đỉnh ngon mà k lỗi j. Nhưng để nó tổng quát hơn e mong bác sửa giúp e một số yếu tố để kết quả nó như mong đợi ạ.

Trong bản vẽ yếu tố xác định giao là 225 line thuộc lỚp "ENTCOC" ===> Kết quả là 225 đỉnh

Bài toán như sau: Kiểm tra vị trí giao giữa đường pline và các line

    - Nếu vị trí giao không trùng vị trí 1 đỉnh nào của Pline thì thêm đỉnh tại vị trí giao (n line giao với pline tại cùng 1 vị trí cho ra n đỉnh tại điểm giao với Pline)

    - Nếu vị trí giao trùng vị trí 1 đỉnh nào của Pline thì xét tiếp n line giao với pline tại cùng 1 đỉnh cho ra n đỉnh tại vị trí đỉnh Pline)

 

+ Bác có thể giúp e bỏ điều kiện chỉ nhận các line thuộc lớp EnTcoc không ạ. Hoặc cách nào để lựa chọn Xác định line giao với pline theo lớp với ạ

Hề hề hề,

Đó , bạn thấy chưa, ngay cả khi đã có bản vẽ mà người làm lisp vẫn có thể hiểu nhầm ý người cần lisp. và cho ra đời cái lisp không dạt yêu cầu của người cần.

vậy nên nếu bạn cứ tiết kiệm thời gian và công sức của bạn theo kiểu như trước thì sẽ mất rất nhiều thời gian của những người muốn giúp bạn, dẫn tới hiệu quả cái bạn được sẽ là cái bạn không muốn.

Bạn xem kỹ lại lisp của mình viết sẽ thấy:

1/- Lisp chỉ thêm đỉnh cho pline tại các điểm giao cắt với line được chọn mà điểm này không trùng với đỉnh của pline. Tại các điểm giao cắt trùng với đỉnh có sẵn của pline thì lisp không tạo thêm đỉnh làm chi cho mất công nữa cả. Do vậy yêu cầu thứ nhất của bạn theo mình là lisp này đã thỏa mãn.

Cụ thể , với bản vẽ bạn gửi lên, pline có 160 đỉnh , sau khi chạy lisp, pline sẽ thêm được 139 đỉnh nữa tại các giao cất không trùng với đỉnh của pline cũ và tổng cộng pline mới của bạn sẽ có 299 đỉnh.

Thú thự là mình cũng chả có thời gian ngồi đếm các đỉnh trên pline của bạn đâu, nhưng mình kiểm tra bằng lisp thì thấy như vậy. Còn đúng sai, nhờ bạn chịu khó kiểm lại nhé.

2/- Về yêu cầu thứ hai: Ý bạn có phải là cho người dùng được phép chọn lựa lớp của các line cần tìm giao cắt phải không???

nếu đúng vậy bạn hãy chịu khó sửa lại lisp một chút như sau:

a/- Thêm các dòng code :

(if (not (setq lac (gestring "\n Nhap ten layer cua cac line can tim giao cat")))

    (setq lac (cdr (assoc 8 (entget (car (entsel "\n Chon line mau"))))) )

)

vào phía dưới dòng code (command "undo" "be") và phía trên dòng code (setq obj (vlax-ename->vla-object pl)

b/- Sửa lại dòng code:

ssl (acet-ss-to-list (ssget (list (cons 0 "line") (cons 8 "ENTCOC"))))

thành:

ssl (acet-ss-to-list (ssget (list (cons 0 "line") (cons 8 lac))))

c/- Sau đó lưu lại file và test thử coi đã ưng ý chưa.

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

E đã test bác ạ.

- Test Lisp cũ trước khi sửa được 292 đỉnh chứ không phải 299 đỉnh ạ. E dùng lisp chứ không biết kiểm tra số đỉnh như thế nào. tại có đỉnh trùng nhau mà

- Test lisp sau khi sửa thì báo lỗi không chạy được bác ạ. Hay e sửa và thêm không đúng chỗ không biết

 

/- Thêm các dòng code :...
vào phía dưới dòng code (command "undo" "be") và phía trên dòng code (setq obj (vlax-ename->vla-object pl)

Giữa hai dòng này e thấy còn mấy dòng nữa ạ

 

Thonng bao loi:

"Command: ii undo Enter the number of operations to undo or
[Auto/Control/BEgin/End/Mark/Back] <1>: be
Command:
Chon pline muon them dinhzoom
Specify corner of window, enter a scale factor (nX or nXP), or
[All/Center/Dynamic/Extents/Previous/Scale/Window/Object] <real time>: e
Command:
Error: no function definition: GESTRING; error: An error has occurred inside
the *error* functionAutoCAD variable setting rejected: "cmdecho" nil"

 

Tối kiến của e là có thể giải bài toán bằng cách vẽ pline theo đường dẫn đi qua các đỉnh đường dẫn và các điểm giao cắt.

Liệu theo cách này thì code bác viết có dễ hơn k ạ. 

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

E đã test bác ạ.

- Test Lisp cũ trước khi sửa được 292 đỉnh chứ không phải 299 đỉnh ạ. E dùng lisp chứ không biết kiểm tra số đỉnh như thế nào. tại có đỉnh trùng nhau mà

- Test lisp sau khi sửa thì báo lỗi không chạy được bác ạ. Hay e sửa và thêm không đúng chỗ không biết

 

/- Thêm các dòng code :...

vào phía dưới dòng code (command "undo" "be") và phía trên dòng code (setq obj (vlax-ename->vla-object pl)

Giữa hai dòng này e thấy còn mấy dòng nữa ạ

 

Thonng bao loi:

"Command: ii undo Enter the number of operations to undo or

[Auto/Control/BEgin/End/Mark/Back] <1>: be

Command:

Chon pline muon them dinhzoom

Specify corner of window, enter a scale factor (nX or nXP), or

[All/Center/Dynamic/Extents/Previous/Scale/Window/Object] <real time>: e

Command:

Error: no function definition: GESTRING; error: An error has occurred inside

the *error* functionAutoCAD variable setting rejected: "cmdecho" nil"

 

Tối kiến của e là có thể giải bài toán bằng cách vẽ pline theo đường dẫn đi qua các đỉnh đường dẫn và các điểm giao cắt.

Liệu theo cách này thì code bác viết có dễ hơn k ạ. 

Hề hề hề,

1/- Lỗi tại dòng code (getstring ....) chứ không phải là (gestring ....) . Lỗi này do mình đánh máy nhầm vì mình sử dụng kiểu gõ Vni nên nhiều lúc bị mất các ký tự.

2/- Cái tối kiến của bạn sáng ra trò chứ chả tới nỗi tù mù. Song nó chỉ thích hợp khi polyline của bạn toàn các phân đoạn thẳng chứ không chứa arc. nếu polyline mà chứa arc thì nó sẽ vẽ ra một polyline mới không trùng với pline cũ bạn ạ. 

3/- Thực ra cũng có thể làm theo cái tối kiến của bạn, song vì mình chưa hiểu rõ các cấu tạo polyline theo hình bạn gửi nên chả dám chọc ngoáy nhiều, chỉ là tận dụng những gì mình đã biết đẻ xử lý chứ chửa dám chui sâu vào trong ...... quần .... chúng..... nó.

4/- Để đền bù cho cái lỗi cẩu thả của mình, bạn hãy download lại lisp dưới đây và test nhé

5/- Sở dĩ bạn chỉ  có được 292 đỉnh là do khi bạn chọn đối tượng cho tập hợp các line giao cắt bạn đã rê chuột làm màn hình thiếu mất một vài line đó. Cần lưu ý điều này, khi chọn vùng chứa các đối tượng line, nên lăn chuột giữa để sao cho có thể nhìn thấy hết toàn bộ vùng chọn và chỉ cần chọn một phát là ăn ngay, không phải rê hay kéo chuột thêm nữa.

6/- Do mình chưa test đoạn code bổ sung nên thực ra nó còn vài lỗi không hay nữa nhưng vẫn có thể chạy được. Mình đã sửa lại và bổ sung nó trong lisp dưới đây. bạn download lại và check nhé. Lisp này cho phép hai kiểu chọn layer chứa các line cần tìm giao cắt.

a/- nếu bạn nhớ được tên lớp của nó thì nhập tên lớp này khi lisp yêu cầu bạn nhập tên lớp chứa các line cần tìm giao cắt.

b/- Trong trường hợp bạn không nhớ tên lớp này, bạn cứ nhấn enter khi lisp hỏi như vậy để bỏ qua và lisp sẽ yêu cầu bạn chọn đối tượng line mau. Khi đó bạn pick chọn vào một đối tượng line bất lý trong số các line cần tìm giao cắt. lisp sẽ tự tìm ra tên của layer chứa nó để tìm các đối tượng còn lại.

 

Chúc bạn vui.

http://www.cadviet.com/upfiles/3/5194_addvertexpolyline_1.lsp

  • 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

Thank bác vì món quà bác tặng.

E đã test lại thì thấy lỗi với đường polyline ạ. Đối với đường polyline kết quả sau khi chạy lisp chỉ cắt đối tượng ở điểm giao thứ nhất ạ. e cũng không biết về sự khác nhau giữa đường poline và đường 2d polyline lắm. chỉ thi thoảng dùng lệnh plinetype chọn biến hệ thống là 0 or 1 or 2 rồi dùng lệnh pe chọn 2d polyline thì nó chuyển thành polyline ạ. Chuyển ngược lại thì không đượ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

Thank bác vì món quà bác tặng.

E đã test lại thì thấy lỗi với đường polyline ạ. Đối với đường polyline kết quả sau khi chạy lisp chỉ cắt đối tượng ở điểm giao thứ nhất ạ. e cũng không biết về sự khác nhau giữa đường poline và đường 2d polyline lắm. chỉ thi thoảng dùng lệnh plinetype chọn biến hệ thống là 0 or 1 or 2 rồi dùng lệnh pe chọn 2d polyline thì nó chuyển thành polyline ạ. Chuyển ngược lại thì không được

Hề hề hề.

Bạn hãy gửi cái bản vẽ bạn test không được ấy lên để mình check lại nhé.

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

Dạ vâng đây bác ạ http://www.cadviet.com/upfiles/3/116735_116735_chen_dinh.dwg

vẫn là file cũ e up lên. e vẽ đường pline và các line giao cắt rồi test. Nếu bác ngại tài về thì dùng file cũ e up trước cũng vậy ạ.

thank bá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

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

×