Chuyển đến nội dung
Diễn đàn CADViet
thanh96

Nối thép 40D

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

Nhờ các anh giúp ak!!

     Em đang muốn lập một lisp để nối thép 40d từ 1 đường thẳng đã vẽ. Tức là:

         - Break nó thành 2 đường sau từ điểm pick break đó move 1 đường xuống 100

         - Nhập đường kính d sau đó strech đường vừa move xuống 40d

        - Nếu có thể dim 2 đầu 40d đó luôn ak.

   Không biết ý tưởng đó có làm được không ak. 

Em gà mờ chỉ viết được mấy cái lisp nhỏ nhỏ thui ak.

Mong các anh giúp ak. 

Em cảm ơn ak.

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

À, sorry bạn. Tôi hiểu sai đề bài.

Tôi sẽ viết cho bạn sau đợt nghỉ lễ nếu chưa có bác nào rảnh viết cho bạn.

Bạn nên đưa thêm cái hình ảnh cho trực quan.

  • 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
19 giờ trước, Danh Cong đã nói:

Mà bạn viết được lisp nho nhỏ là thế nào. Tôi nghĩ bạn có thể làm được. Hãy đưa ra ý tưởng đi. :)

 

1.lsp

Em viết như này  cơ mà nó đang còn dính lỗi cái điểm P3 ý em gắn vậy cơ mà nó không nhảy điểm là do gì ak.

Với để dim 2 điểm trong lisp ak.

Em cảm ơn ak

(defun c:1 ( / )
(setq obj (entsel "Select object: ")
    d (getreal "\n Duong kinh:"))
(setq    VL-Obj (vlax-ename->vla-object (car obj )))
(setq    p2 (vlax-curve-getEndPoint VL-Obj ))
(setq    p1 (getpoint "chon diem cut: "))
(setq     a1 (- (car p1) (* 40 d))
    a2 (- (cadr p1) 100)    
     b1 (car p2)            
     b2 (- (cadr p2) 100))
(setq    p3 (list a1 b2)
        p4 (list b1 b2))
(command "break" p2 p1)
(command ".line" p4 p3 "")
 )

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
7 giờ trước, thanh96 đã nói:

 

1.lsp

Em viết như này  cơ mà nó đang còn dính lỗi cái điểm P3 ý em gắn vậy cơ mà nó không nhảy điểm là do gì ak.

Với để dim 2 điểm trong lisp ak.

Em cảm ơn ak

(defun c:1 ( / )
(setq obj (entsel "Select object: ")
    d (getreal "\n Duong kinh:"))
(setq    VL-Obj (vlax-ename->vla-object (car obj )))
(setq    p2 (vlax-curve-getEndPoint VL-Obj ))
(setq    p1 (getpoint "chon diem cut: "))
(setq     a1 (- (car p1) (* 40 d))
    a2 (- (cadr p1) 100)    
     b1 (car p2)            
     b2 (- (cadr p2) 100))
(setq    p3 (list a1 b2)
        p4 (list b1 b2))
(command "break" p2 p1)
(command ".line" p4 p3 "")
 )

+ Bạn viết được vậy cũng là khá rồi. Cố thêm ít nữa chắc sẽ ok :))

Tôi nghĩ bạn nên bổ xung điều sau cho lisp:

+ Tắt chế độ bắt điểm (setvar "osmode" 0) Sau khi chọn hết, nhập hết số liệu để tránh trường hợp máy bắt điểm nhầm.

+ Lisp này hiện tại chỉ hoạt động với đường thẳng nằm ngang. Vậy đường xiên thì sao?

+ Điểm EndPoint của đường thẳng có thể nằm ở 1 trong 2 đầu. Vì thế đoạn nối lúc thì bên trái, lúc thì bên phải. Bạn sẽ giải quyết thế nào ?

+ Nếu là đường thẳng, thay vì Break thì bạn có hết toạ độ rồi. Vậy vẽ xừ nó 2 đường thẳng mới,rồi xoá đường thẳng cũ đi. Liệu có ok hơn không :))) hề hề.

  • 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
Vào lúc 1/9/2018 tại 21:40, Danh Cong đã nói:

+ Bạn viết được vậy cũng là khá rồi. Cố thêm ít nữa chắc sẽ ok :))

Tôi nghĩ bạn nên bổ xung điều sau cho lisp:

+ Tắt chế độ bắt điểm (setvar "osmode" 0) Sau khi chọn hết, nhập hết số liệu để tránh trường hợp máy bắt điểm nhầm.

+ Lisp này hiện tại chỉ hoạt động với đường thẳng nằm ngang. Vậy đường xiên thì sao?

+ Điểm EndPoint của đường thẳng có thể nằm ở 1 trong 2 đầu. Vì thế đoạn nối lúc thì bên trái, lúc thì bên phải. Bạn sẽ giải quyết thế nào ?

+ Nếu là đường thẳng, thay vì Break thì bạn có hết toạ độ rồi. Vậy vẽ xừ nó 2 đường thẳng mới,rồi xoá đường thẳng cũ đi. Liệu có ok hơn không :))) hề hề.

Anh giúp em với sửa mãi nó cứ lỗi kiểu gì ý ak.

Em cản ơn ak

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
3 giờ trước, thanh96 đã nói:

Anh giúp em với sửa mãi nó cứ lỗi kiểu gì ý ak.

Em cản ơn ak

Tôi đã sửa lại một số chỗ. Bạn chạy thử xem thế nào.

(defun c:1 ( / A1 A2 B1 B2  OBJ OLDOS P1 P2 P3 P4 VL-OBJ )
(command "cmdecho" 0)
(setq oldos (getvar "osmode"))
(or duongkinhthep (setq duongkinhthep 16))
(setq duongkinhthep (cond ((getreal (strcat "\nDuong Kinh Thep: < " (rtos duongkinhthep 2 0) " >:")))(duongkinhthep))) 
  
(setq     obj (entsel "Select object: ")
    VL-Obj (vlax-ename->vla-object (car obj ))
    p-end (vlax-curve-getEndPoint VL-Obj )
    p-start (vlax-curve-getStartPoint VL-Obj )
    p1 (getpoint "chon diem Break: "))
(if (< (car p-end) (car p-start)) (setq p2 p-start) (setq p2 p-end))
(setvar "osmode" 0)  
(setq     a1 (- (car p1) (* 40 duongkinhthep))
        a2 (- (cadr p1) 100)    
         b1 (car p2)            
         b2 (- (cadr p2) 100))
  
(setq   p3 (list a1 b2)
        p4 (list b1 b2))
(command "break" p2 p1)
(command ".line" p4 p3 "")
(setvar "osmode" oldos)
(princ)
 )

  • 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
Vào lúc 31/8/2018 tại 18:25, Danh Cong đã nói:

Mà bạn viết được lisp nho nhỏ là thế nào. Tôi nghĩ bạn có thể làm được. Hãy đưa ra ý tưởng đi. :)

Em lại gặp lỗi nữa nhờ anh giúp ak.

Nếu vẫn lisp cũ ý ak. Gặp trường hợp 2 đầu thanh đó bẻ neo thì nó chưa xử lí được tại mình đang để break ra sau đó vẽ 1 đường line khác.

Có cách nào xử lí được không ak.

Trước em chưa xử lí hết trg hợp giờ làm mới thấy ak.

Em cảm ơn ak.

Noi 40d.lsp

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
10 giờ trước, thanh96 đã nói:

Em lại gặp lỗi nữa nhờ anh giúp ak.

Nếu vẫn lisp cũ ý ak. Gặp trường hợp 2 đầu thanh đó bẻ neo thì nó chưa xử lí được tại mình đang để break ra sau đó vẽ 1 đường line khác.

Có cách nào xử lí được không ak.

Trước em chưa xử lí hết trg hợp giờ làm mới thấy ak.

Em cảm ơn ak.

Noi 40d.lsp

Chịu. Gặp Polyline thì rắc rối nên tôi chịu.

  • 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
5 giờ trước, Danh Cong đã nói:

Chịu. Gặp Polyline thì rắc rối nên tôi chịu.

Với nội lực của DanhCong chỉ cần vẫy tay 1 phát là xong mà! :-)

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
58 phút trước, quocmanh04tt đã nói:

Với nội lực của DanhCong chỉ cần vẫy tay 1 phát là xong mà! :-)

Để em thử: Lúc đầu em nghĩ là giải bài này theo kiểu phải dựng lại toàn bộ số liệu của  Pline ( Tức là coi như phải vẽ lại Polyline đấy, bao nhiêu cung tròn tâm tròn phải đọc được hết trên Pline cũ, rồi lại dựng lại Pline mới, nên nghĩ hơi bị đau đầu). Thấy bác nói vậy em thử lại bằng lệnh Break, xem chừng thế nào lại ăn thua hơ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
18 giờ trước, thanh96 đã nói:

Em lại gặp lỗi nữa nhờ anh giúp ak.

Nếu vẫn lisp cũ ý ak. Gặp trường hợp 2 đầu thanh đó bẻ neo thì nó chưa xử lí được tại mình đang để break ra sau đó vẽ 1 đường line khác.

Có cách nào xử lí được không ak.

Trước em chưa xử lí hết trg hợp giờ làm mới thấy ak.

Em cảm ơn ak.

Noi 40d.lsp

Nhìn hơn loạn mắt, nhưng cũng ra được sản phẩm:

 

(defun c:DC ( / OBJ1 OBJ2 OLDOS P-BREAK P-BREAK21 P-BREAK22 P-BREAK40 P-END P-START PX-MAX PX-MIN VL-OBJ1)
(Princ "\nDanh Cong-01636 760 750")
(command "cmdecho" 0)
(setq oldos (getvar "osmode"))
(or duongkinhthep (setq duongkinhthep 16))
(setq duongkinhthep (cond ((getreal (strcat "\nDuong Kinh Thep: < " (rtos duongkinhthep 2 0) " >:")))(duongkinhthep))) 

  
(setq obj1 (car (entsel "Select object: "))
    VL-Obj1 (vlax-ename->vla-object obj1)
    p-end (vlax-curve-getEndPoint VL-Obj1 )
    p-start (vlax-curve-getStartPoint VL-Obj1 )
    p-break (vlax-curve-getclosestpointto VL-Obj1 (getpoint "Chon diem Break: "))
    )
  
(command "copy" obj1 "" '( 0 0 0) '(0 -100 0))
(setq obj2 (ssget "l"))
(setvar "osmode" 0)
(if (< (car p-start) (car p-end))
    (progn     (setq px-min p-start
              px-max p-end
              p-break40 (vlax-curve-getpointatdist VL-Obj1 (- (vlax-curve-getdistatpoint VL-Obj1 p-break) (* 40 duongkinhthep)))
              p-break21 (list (car p-break40) (- (cadr p-break40) 100))
              p-break22 (list (car px-min) (- (cadr px-min) 100)))
              (command "break" obj1 p-break px-max)
              (command "break" obj2 p-break21 p-break22)
      );end progn 1
    (progn     (setq px-min p-end
         px-max p-start
         p-break40 (vlax-curve-getpointatdist VL-Obj1 (+ (vlax-curve-getdistatpoint VL-Obj1 p-break) (* 40 duongkinhthep)))
         p-break21 (list (car p-break40) (- (cadr p-break40) 100))
         p-break22 (list (car px-min) (- (cadr px-min) 100)))
              (command "break" obj1 p-break px-max)
              (command "break" obj2 p-break21 p-break22)
      ));end progn 2
(setvar "osmode" oldos)
(princ)
 )

  • Like 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
1 giờ} trướ}c, Danh Cong đã nói:

Nhìn hơn loạn mắt, nhưng cũng ra được sản phẩm:

Nhận xét xíu:

- Cũng được nhưng hơi dài.

- Nếu segment của pline tại điểm cắt không nằm ngang thì không đảm bảo k/c 100.

*** Nếu mình làm sẽ đi theo hướng này:

1. Break obj1 tại điểm cắt thành 2 đoạn (2 đoạn này có tổng chiều dài bằng đoạn gốc: Break p-break p-break) - 1 đối tượng vẫn là obj1 và 1 đối tượng là entlast

2. Trước đó lấy góc tại segment bị cắt, xét điều kiện như DanhCong ở trên để quyết định move thằng nào, và góc ang hay ang + pi  (obj1 hay entlast) 1 khoảng (setq pt (polar p-break ang 100)

3. Dùng lệnh Lengthen>Delta = 40 * Duongkinh và pick tại điểm pt ở trên.

Gọn hơn rất nhiều.

  • 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
27 phút trước, quocmanh04tt đã nói:

Nhận xét xíu:

- Cũng được nhưng hơi dài.

- Nếu segment của pline tại điểm cắt không nằm ngang thì không đảm bảo k/c 100.

*** Nếu mình làm sẽ đi theo hướng này:

1. Break obj1 tại điểm cắt thành 2 đoạn (2 đoạn này có tổng chiều dài bằng đoạn gốc: Break p-break p-break) - 1 đối tượng vẫn là obj1 và 1 đối tượng là entlast

2. Trước đó lấy góc tại segment bị cắt, xét điều kiện như DanhCong ở trên để quyết định move thằng nào, và góc ang hay ang + pi  (obj1 hay entlast) 1 khoảng (setq pt (polar p-break ang 100)

3. Dùng lệnh Lengthen>Delta = 40 * Duongkinh và pick tại điểm pt ở trên.

Gọn hơn rất nhiều.

+ Dùng Lengthen sẽ bị lỗi nếu như điểm Break nằm trên đường cong?. Còn nếu đường thẳng thì hướng giải của bác sẽ gọn hơn 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
16 giờ trước, Danh Cong đã nói:

+ Dùng Lengthen sẽ bị lỗi nếu như điểm Break nằm trên đường cong?. Còn nếu đường thẳng thì hướng giải của bác sẽ gọn hơn nhiều :)

Thử xem đường cong có lỗi không nhé!

(defun c:tt  (/ ang ent poi pt vals vars)
  (or (and #duongkinh# (eq (type #duongkinh#) 'int)) (setq #duongkinh# 10))
  (setq #duongkinh#  (cond ((getint (strcat "\nDuong kinh <" (itoa #duongkinh#) ">: "))) (#duongkinh#)))
  (setq vals (mapcar 'getvar (setq vars '(OSMODE CMDECHO))))
  (if (and (setq ent (car (entsel "\nPick object: ")))
           (wcmatch (cdr (assoc 0 (entget ent))) "LINE,LWPOLYLINE")
           (setq poi (getpoint "\nDiem cat: "))
           (setq poi (vlax-curve-getClosestPointTo ent poi)
                 ang (angle '(0 0 0) (vlax-curve-getfirstderiv ent (vlax-curve-getparamatpoint ent poi)))))
    (progn (command "_.UNDO" "Be" "_.BREAK" ent poi poi)
           (mapcar 'setvar vars '(0 0))
           (if (< (car (vlax-curve-getStartPoint ent)) (car (vlax-curve-getEndPoint ent)))
             (setq ent (entlast))
             (setq ang (+ pi ang)))
           (setq pt (polar poi (+ ang (* 1.5 pi)) 100))
           (command "_.MOVE" ent "" poi pt "_.LENGTHEN" "DE" (* 40 #duongkinh#) pt "" "_.UNDO" "end")
           (mapcar 'setvar vars vals)))
  (princ))

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ự là dính bắt điểm tự động. Tắt bắt điểm trước khi chạy lisp nếu được thì xem mấy bài về bắt điểm trong lisp

  • Like 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
Vào lúc 4/9/2018 tại 15:19, Danh Cong đã nói:

Nhìn hơn loạn mắt, nhưng cũng ra được sản phẩm:

 

(defun c:DC ( / OBJ1 OBJ2 OLDOS P-BREAK P-BREAK21 P-BREAK22 P-BREAK40 P-END P-START PX-MAX PX-MIN VL-OBJ1)
(Princ "\nDanh Cong-01636 760 750")
(command "cmdecho" 0)
(setq oldos (getvar "osmode"))
(or duongkinhthep (setq duongkinhthep 16))
(setq duongkinhthep (cond ((getreal (strcat "\nDuong Kinh Thep: < " (rtos duongkinhthep 2 0) " >:")))(duongkinhthep))) 

  
(setq obj1 (car (entsel "Select object: "))
    VL-Obj1 (vlax-ename->vla-object obj1)
    p-end (vlax-curve-getEndPoint VL-Obj1 )
    p-start (vlax-curve-getStartPoint VL-Obj1 )
    p-break (vlax-curve-getclosestpointto VL-Obj1 (getpoint "Chon diem Break: "))
    )
  
(command "copy" obj1 "" '( 0 0 0) '(0 -100 0))
(setq obj2 (ssget "l"))
(setvar "osmode" 0)
(if (< (car p-start) (car p-end))
    (progn     (setq px-min p-start
              px-max p-end
              p-break40 (vlax-curve-getpointatdist VL-Obj1 (- (vlax-curve-getdistatpoint VL-Obj1 p-break) (* 40 duongkinhthep)))
              p-break21 (list (car p-break40) (- (cadr p-break40) 100))
              p-break22 (list (car px-min) (- (cadr px-min) 100)))
              (command "break" obj1 p-break px-max)
              (command "break" obj2 p-break21 p-break22)
      );end progn 1
    (progn     (setq px-min p-end
         px-max p-start
         p-break40 (vlax-curve-getpointatdist VL-Obj1 (+ (vlax-curve-getdistatpoint VL-Obj1 p-break) (* 40 duongkinhthep)))
         p-break21 (list (car p-break40) (- (cadr p-break40) 100))
         p-break22 (list (car px-min) (- (cadr px-min) 100)))
              (command "break" obj1 p-break px-max)
              (command "break" obj2 p-break21 p-break22)
      ));end progn 2
(setvar "osmode" oldos)
(princ)
 )

Trong lisp chẳng hạn thực hiện liên tiếp các lệnh như copy break.

Khi ctrl+z thì có thể trở lại trạng thái trước khi dùng lệnh được vậy anh.

Dùng nhiều ctrl+z lại hơi lâu anh ak.

Mong anh giúp ak.

 

Noi 40d - Trai_Phai.lsp

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 giờ trước, thanh96 đã nói:

Trong lisp chẳng hạn thực hiện liên tiếp các lệnh như copy break.

Khi ctrl+z thì có thể trở lại trạng thái trước khi dùng lệnh được vậy anh.

Dùng nhiều ctrl+z lại hơi lâu anh ak.

Mong anh giúp ak.

 

Noi 40d - Trai_Phai.lsp

Thử thêm 2 dòng sau vào lisp, bạn có thể tự thêm được .

(Defun c:DC ( / abcxyz)

(Command "undo" "begin")

.....

....

(Command "undo" "end")

(Princ)

)

  • Like 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
Vào lúc 4/9/2018 tại 14:10, Danh Cong đã nói:

Để em thử: Lúc đầu em nghĩ là giải bài này theo kiểu phải dựng lại toàn bộ số liệu của  Pline ( Tức là coi như phải vẽ lại Polyline đấy, bao nhiêu cung tròn tâm tròn phải đọc được hết trên Pline cũ, rồi lại dựng lại Pline mới, nên nghĩ hơi bị đau đầu). Thấy bác nói vậy em thử lại bằng lệnh Break, xem chừng thế nào lại ăn thua hơn :))

Em đang định làm bài toán lát sàn mà chưa biết logic sao cho hợp lí.

Không biết bác gặp loại này bjo chưa ak. (em chỉ thấy rải vật thể theo đường thui ak)

Hiện em đang có suy nghĩ thế này: (gạch axb)

Cách 1: từ đường bao chọn và điểm mốc. kẻ các đường ngang cách nhau a.

             -Tìm giao giữa đường thẳng đó và đường bao. Sau đó dùng lệnh Array rải đối tượng từ điểm giao bên trái sang phải.

            Nhưng cách này nếu gặp tường giật thì gạch sẽ lệch.(rải sai) chắc sửa bằng tay.zz

Cách 2  (cách này sẽ tạo ra các điểm point trước sau copy đối tượng tạo point đó)

           - từ đường bao và điểm mốc>> giới hạn rải x,y max min, từ đó rải điểm cách a,b trong miền.

          - với các điểm (tường giật vào) thì xét các miền ngang đi qua đỉnh của đường bao từ trên xuống dưới ( Xgh và Ygh) hợp với đỉnh (Xmin, Ymax) và (Xmax, Ymax) ta sẽ được 2 miền. Nếu tia đi từ điểm giới hạn qua điểm xét mà không cắt thì loại, nếu cắt thì xét tiếp ở đỉnh tiếp theo.>>Nếu cắt thì cho vào danh sách chọn. cứ thế cho đến hết.

Nhược điểm sẽ không nát được các miền sát mép tường.

Không biết có ổn không anh.

Các cách nào khả thi hơn không ak.

Nhân tiện cái lệnh để kiểm tra xem 2 đối tương có giao nhau không là gì vậy ak. Để em ngồi mày mò ak( chắc là lâu hh)

Nếu có thể anh viết hộ em được không ak.zz

 

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

×