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.
Đăng nhập để thực hiện theo  
levanhuong1989

[Nhờ viết lisp] vẽ, chỉnh sửa đường 3D Polyline theo độ dốc

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

  Như tiêu đề, em nhờ các bác trong diễn đàn viết hộ em lisp để phục vụ tạo lưới thiết kế theo độ dốc. Lisp vẽ đường 3D polyline theo dộ dốc khi nhập cao độ của 1 điểm như sau:

  1. Dùng lệnh, nhập cao độ tại điểm đầu pick chuột
  2. Nhập độ dốc tính toán, pick chuột vào điểm tiếp theo khi đó sẽ tạo được đường 3D polyline với 2 cao độ 2 đỉnh có độ dốc mình vừa nhập. tiếp tục hỏi độ dốc và vẽ các đỉnh tiếp theo của đường Polyline.
  3. Khi muốn chỉnh độ dốc của đường Polyline thì mình kick vào đoạn cần chỉnh (giả sử đoạn này tạo bởi 2 đỉnh số 1 và 2) nhập độ dốc mới và lisp sẽ tính toán cao độ đỉnh Polyline đỉnh số 2 theo cao độ đỉnh số 1 và độ dốc nhập vào. Các đỉnh tiếp theo của đường Polyline sẽ tự động được tính lại dựa vào độ dốc vốn có của nó. 

Cảm ơn các bác trong diễn đàn!

Em gửi kèm theo bản vẽ để các bác xem giúp em.

http://www.cadviet.com/upfiles/4/49411_banve.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
phamthanhbinh    3.123

  Như tiêu đề, em nhờ các bác trong diễn đàn viết hộ em lisp để phục vụ tạo lưới thiết kế theo độ dốc. Lisp vẽ đường 3D polyline theo dộ dốc khi nhập cao độ của 1 điểm như sau:

  1. Dùng lệnh, nhập cao độ tại điểm đầu pick chuột
  2. Nhập độ dốc tính toán, pick chuột vào điểm tiếp theo khi đó sẽ tạo được đường 3D polyline với 2 cao độ 2 đỉnh có độ dốc mình vừa nhập. tiếp tục hỏi độ dốc và vẽ các đỉnh tiếp theo của đường Polyline.
  3. Khi muốn chỉnh độ dốc của đường Polyline thì mình kick vào đoạn cần chỉnh (giả sử đoạn này tạo bởi 2 đỉnh số 1 và 2) nhập độ dốc mới và lisp sẽ tính toán cao độ đỉnh Polyline đỉnh số 2 theo cao độ đỉnh số 1 và độ dốc nhập vào. Các đỉnh tiếp theo của đường Polyline sẽ tự động được tính lại dựa vào độ dốc vốn có của nó.

Cảm ơn các bác trong diễn đàn!

Em gửi kèm theo bản vẽ để các bác xem giúp em.

http://www.cadviet.com/upfiles/4/49411_banve.dwg

Hề hề hề,

Bài toán của bạn chưa rõ ràng. Nhập độ dốc cần phải có hướng dốc nữa mới xác định được cao độ của điểm tiếp theo chớ

Nên tách thành hai bài toán khác nhau , một là vẽ pline, hai là chỉnh sửa pline.

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

1. Khi nhập độ dốc mặc định nếu thêm dấu "-" sẽ là dốc xuống, không âm sẽ là dốc hướng lên. khi nhập độ dốc xong thì mình Pick tiếp 1 điểm khi đó lisp tính cao độ điểm tiếp theo dựa vào

    - Điểm đầu

    - Độ dốc

    - Khoảng cách giữa điểm thứ n và điểm đặt của đỉnh thứ n+1 mình vừa Pick

2. Đúng ý em là muốn tách thành 2 bài toán khác nhau nhưng trình bày chưa rõ.

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
phamthanhbinh    3.123

Chắc 2 ngày cuối tuần nên chưa có bác nào qua đọc. Mong các bác giúp em giải quyết vấn đề này với.

Hề hề hề,

Vì bạn chưa trả lời nên mình đoán bừa và viết tạm lisp như sau để bạn dùng thử. Nếu ưng sẽ sửa chữa bổ sung sau nhé.

Lisp gồm có hai lệnh là vpdd để vẽ polyline theo độ dốc và lệnh cdd để chỉnh độ dốc của một đoạn trên polyline đã có.

Lệnh vẽ polyline sẽ quy ước độ dốc âm là ngược chiều polyliine và độ dốc dương là theo chiều polyline.

Hãy dùng thử coi sao nhé.

(defun c:vpdd (/ oldos p1 p2 p01 p02 h d l )
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(command "ucs" "w")
(setq p1 (getpoint "\n Nhap diem bat dau ve")          
          h (getreal "\n Nhap cao do ban dau: ")
           p01 (list (car p1) (cadr p1) h)  )
(command "3dpoly" p01) 
(while (setq p2 (getpoint p1 "\n Nhap diem tiep theo"))
           (setq d (getreal "\n Nhap do doc: ")
                     l (distance p1 p2)
                    
                     p02 (list (car p2) (cadr p2) (setq h (+ h (* l d)))) 
                     p1 p2  )
          (command  p02 )
          (setq p01 p02)
)
(command "")
(command "ucs" "p")
(setvar "osmode" oldos)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun c:cdd(/ oldos epl p1 obj plst plst1 plst2 plst3 par par0 p0 d h p2 p20 p3 p30 l)
(setq oldos (getvar "osmode"))
(setvar "osmode" 512)
(setq epl (car (setq pl (entsel "\n Chon doan polyline can chinh do doc"))))
(setq p1 (cadr pl))
(setq obj (vlax-ename->vla-object epl))
(setq plst (acet-geom-vertex-list epl))
(setq p1 (vlax-curve-getClosestPointTo obj p1 nil) )
(setq par (vlax-curve-getParamAtPoint obj p1) )
(setq d (getreal "\n Nhap do doc moi: "))
(setq plst1 (list) plst2 (list))
(foreach p plst
    (setq par0 (vlax-curve-getParamAtPoint obj p))
    (if (< par0 par)
        (setq plst1 (append plst1 (list p)))
        (setq plst2 (append plst2 (list p)))
    )
)
(setq p2 (last plst1) p3 (car plst2) p20 (list (car p2) (cadr p2) 0) p30 (list (car p3) (cadr p3) 0)
          l (distance p20 p30) h (- (last p3) (+ (last p2) (* l d)))  plst3 (list) )
(foreach p0 plst2
        (setq p0 (list (car p0) (cadr p0) (- (caddr p0) h)))
        (setq plst3 (append plst3 (list p0)))
)
(setq plst3 (append plst1 plst3))
(command "3dpoly")
        (foreach p plst3
              (command p)
        )
(command "")
(command "erase" epl "")
(setvar "osmode" oldos)
 
)
         
 
  • 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

Cảm ơn bác đã giúp đỡ.

Em đã dùng thử và có thấy vẫn còn một số vấn đề:

1. Theo em công thức tính cao độ đỉnh thứ 2 dựa vào độ dốc, khoảng cách, cao độ thì bác viết vội giúp em nên bác đặt nhầm

em tạm sửa lại như sau: 

 " p02 (list (car p2) (cadr p2) (setq h (+ h (* l d))))  "  thành   "  p02 (list (car p2) (cadr p2) (setq h (+ h (* (/ d 100) l)))) "

2. Trong quá trình chọn điểm thì bắt buộc phải tắt truy bắt điểm như vậy thì chọn theo những điểm cố định sẽ khó, mong bác sửa giúp.

3. Lisp CDD thì em dùng nhưng chưa có tác dụng. Em đã thử tạo đường bằng lệnh VPDD và dùng lệnh CDD để chỉnh thì cao độ tại các đỉnh vẫn như cũ, không có gì thay đổi. 

Bên trên là một số vấn đề khi sử dụng lisp của bác viết giúp, mong bác giúp đỡ hoàn thiện thêm.

Cảm ơn bác Phamthanhbinh và các thành viên đã giú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
phamthanhbinh    3.123

Cảm ơn bác đã giúp đỡ.

Em đã dùng thử và có thấy vẫn còn một số vấn đề:

1. Theo em công thức tính cao độ đỉnh thứ 2 dựa vào độ dốc, khoảng cách, cao độ thì bác viết vội giúp em nên bác đặt nhầm

em tạm sửa lại như sau: 

 " p02 (list (car p2) (cadr p2) (setq h (+ h (* l d))))  "  thành   "  p02 (list (car p2) (cadr p2) (setq h (+ h (* (/ d 100) l)))) "

2. Trong quá trình chọn điểm thì bắt buộc phải tắt truy bắt điểm như vậy thì chọn theo những điểm cố định sẽ khó, mong bác sửa giúp.

3. Lisp CDD thì em dùng nhưng chưa có tác dụng. Em đã thử tạo đường bằng lệnh VPDD và dùng lệnh CDD để chỉnh thì cao độ tại các đỉnh vẫn như cũ, không có gì thay đổi. 

Bên trên là một số vấn đề khi sử dụng lisp của bác viết giúp, mong bác giúp đỡ hoàn thiện thêm.

Cảm ơn bác Phamthanhbinh và các thành viên đã giúp đỡ.

Hề hề hề.

1/- Không có gì nhầm ở đây đâu. Chỉ là quan niệm của bạn khác với mình. Với bạn nếu độ dấc là 2% thì bạn sẽ nhập 2 còn mình thì yêu cầu nhập 0.02. Đơng giản vậy thôi.

2/- Việc bạn muốn chọn các loại truy bắt điểm nào thì bạn có thể tự sửa vào dòng code (setvar "ósmode" 0) , thay 0 bằng giá trị bạn muốn.

3/- Lisp CDD mình đã test và thấy chạy ngon lành mới post lên. bạn hãy kiểm tra lại và lưu ý về cách nhập độ dốc mình đã nói trên.. Còn nếu bạn test vẫn không được thì gửi cái file bạn test lên đây.

Chúc 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

Hề hề hề.

1/- Không có gì nhầm ở đây đâu. Chỉ là quan niệm của bạn khác với mình. Với bạn nếu độ dấc là 2% thì bạn sẽ nhập 2 còn mình thì yêu cầu nhập 0.02. Đơng giản vậy thôi.

2/- Việc bạn muốn chọn các loại truy bắt điểm nào thì bạn có thể tự sửa vào dòng code (setvar "ósmode" 0) , thay 0 bằng giá trị bạn muốn.

3/- Lisp CDD mình đã test và thấy chạy ngon lành mới post lên. bạn hãy kiểm tra lại và lưu ý về cách nhập độ dốc mình đã nói trên.. Còn nếu bạn test vẫn không được thì gửi cái file bạn test lên đây.

Chúc thành công.

 

 

1. Sorry bác về cái tính độ dốc, tối hôm qua em vội quá chưa nghĩ ra là bác đang dùng cách  nhập là 0.02 hiii.

2. Em đã thay osmode bằng các giá trị khác để bắt điểm nhưng khi bắt được điểm thì cao độ tại các đỉnh đều bằng 0 ( em gửi kèm bản vẽ)

3. Em gửi bác file bản vẽ đã tạo đường bằng lệnh VPDD nhưng dùng lệnh CDD để chỉnh độ dốc thì cao độ tại các đỉnh không thay đổi. Mong bác xem giúp.

http://www.cadviet.com/upfiles/4/49411_khong_dung_duoc_lenh_cdd.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
phamthanhbinh    3.123

 

 

1. Sorry bác về cái tính độ dốc, tối hôm qua em vội quá chưa nghĩ ra là bác đang dùng cách  nhập là 0.02 hiii.

2. Em đã thay osmode bằng các giá trị khác để bắt điểm nhưng khi bắt được điểm thì cao độ tại các đỉnh đều bằng 0 ( em gửi kèm bản vẽ)

3. Em gửi bác file bản vẽ đã tạo đường bằng lệnh VPDD nhưng dùng lệnh CDD để chỉnh độ dốc thì cao độ tại các đỉnh không thay đổi. Mong bác xem giúp.

http://www.cadviet.com/upfiles/4/49411_khong_dung_duoc_lenh_cdd.dwg

Hề hề hề.

2/- Bạn đả sửa lisp ra sao???

3/- Mình đã test lisp cdd trên chính bản vẽ mà bạn gửi thì thấy nó thay đổi cao độ ầm ầm chứ có trục trặc gì đâu. Bạn đã sử dụng lisp như thế nào??

Cách sử dụng lisp này như sau:

load lisp rồi gõ lệnh cdd . Pick chọn vào đúng đoạn polyline cần thay đổi độ dốc và nhập độ dốc mới là OK. Lưu ý rằng độ dốc mới nhập theo cách 2%= 0.02.

 

Túm lại là mình chưa thấy lỗi của lisp nên chưa thể sửa giúp bạn. Mong bạn kiểm tra kỹ lại thao tác của bạn nhé.

  • 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
ndtnv    396

Trong hàm CDD thêm

(setvar "osmode" 0)

vào trước dòng

(command "3dpoly")

nếu muốn nhập 2% thay cho 0.02 thì sửa thành

(setq h (+ h (* (/ d 100.) l)))

Công thức tính chiều dài p1p2 trong hàm vpdd phải sửa giống như trong hàm CDD

  • 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

2/- Bạn đả sửa lisp ra sao???

 

Em đã thay dòng (setvar "osmode" 0) thành (setvar "osmode" 512) và thử vẽ 2 đường Polyline làm 2 điểm ngăn( giả định) và dùng lệnh VPDD để chọn điểm nằm trên 2 đường thẳng vừa vẽ. và thử pick 1 điểm ra ngoài 2 đường đó kết quả là 2 đỉnh chọn trên 2 đường polyline có cao độ bằng 0 còn đỉnh pick bên ngoài có cao độ khác 0 .

Bác xem giúp vấn đề này 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
phamthanhbinh    3.123

Em đã thay dòng (setvar "osmode" 0) thành (setvar "osmode" 512) và thử vẽ 2 đường Polyline làm 2 điểm ngăn( giả định) và dùng lệnh VPDD để chọn điểm nằm trên 2 đường thẳng vừa vẽ. và thử pick 1 điểm ra ngoài 2 đường đó kết quả là 2 đỉnh chọn trên 2 đường polyline có cao độ bằng 0 còn đỉnh pick bên ngoài có cao độ khác 0 .

Bác xem giúp vấn đề này với.

Hề hề hề,

Bạn sử dụng truy bắt điểm là 512 tức là nearest. Do vậy khi Cad thực hiện lệnh vẽ trên màn hình, nếu bạn vẫn để ở chế dộ phẳng (top) thì Cad sẽ chọn điểm gần với một đối tượng đã có trên màn hình nhất tính từ điểm pick (có nghĩa là lấy chính điểm có trên đối tượng chuẩn của bạn chứ không phải điểm p01 trong lisp).

Đó chính là nhược điểm của việc sử dụng truy bắt điểm có sẵn trong CAD.

Với trường hợp lỗi của lisp cdd cũng tương tự là do bạn đang đặt CAD ở chế độ truy bắt điểm nào đó khác với none và thực hiện lệnh lisp trên màn hình top. Việc sửa của bác ndtnv chính là khử truy bắt điểm mà thôi.

Theo kinh nghiệm của bản thân mình thường đặt CAd ở chế độ truy bắt điểm là none và khi cần truy bắt sẽ sử dụng các nút lệnh truy bắt trên CAD. Như vậy khi chạy lisp ít phải quan tâm tới việc truy bắt điểm này.

Một điều cần lưu ý nữa khi sử dụng các truy bắt điểm của CAd là nên sử dụng selection box đủ nhỏ để tránh việc truy bắt nhầm khi bản vẽ có quá nhiều đối tượng gần nhau.

 

Với trường hợp trên của bạn, hãy thử mở màn hình ở chế độ 3D (SW Isometric chẳng hạn) và thực hiện lệnh vpdd coi có còn bị như vầy nữa không khi sử dụng truy bắt điểm là 512. Khi mình test lisp cdd thì mình để màn hình ở chế độ này nên không phát hiện lỗi như bạ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
phuong44e1    2

Chào các Pro.

Nhờ các Pro giúp e chút nha, e muốn vẽ 1 polyline với thao tác như sau:

Gọi lệnh PL1:

->Dòng nhắc sẽ báo mình đặt tên cho layer " Vui long dat ten cho layer" -> Name của layer sẽ được gõ trực tiếp vào trên dòng nhắc

->Sau khi đặt tên xong thì dòng nhắc sẽ yeu cầu chọn màu cho layer (sẽ hiện ra bảng màu cho mình chọn)

->Dòng nhắc sẽ báo chọn loại nét (sẽ hiện bảng ra cho mình chọn loại net liền hay đứt...)

->Layer này sẽ được set  thành layer  hiện hành

->Sau đó sẽ vẽ polyline như lệnh PL bình thường.

 

Cảm ơn các Pro nhiề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
phuong44e1    2

Việc này dùng lệnh Layer và Pline chắc nhanh hơn lisp đó bạn!

Chào bạn Đoàn Văn Hà.

Mình biết sử dụng hai lệnh này là rất đơn giản và nhanh. nhưng mình mong muốn được làm như vậy. Nếu được rất mong bạn giúp mình.

Rất xin lỗi vì mình đăng bài vào chủ đề của bạn. Nhưng quả thực mình tìm cách đang bài mới mà không được. Hihi

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
phuong44e1    2

Chào bạn Doan van Ha,

Mình muốn sử dụng hàm kết hợn này thì trông nó chuyên nghiệp hơn ý mà.

mình làm dự toán, muốn gộp nó lại như là lệnh vẽ cấu kiện. như vậy trông nó sẽ chuyên nghiệp hơn sử dụng hai lệnh LA và PL.

Please help me!

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

Đăng nhập để thực hiện theo  

×