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  
pvaqnster

Nhờ các cao thủ Lips giúp em như trong miêu tả ở bản vẽ này với.

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

Tot77    501

Bạn dùng líp dưới đây, chọn từng dãy circle, cuối cùng enter để nối các dãy. Dim theo kiểu hiện hành.

 

(defun c:tmp(/ os pll l n)
  (defun dxf(id v) (list (car (setq tm (cdr (assoc id (entget v))))) (cadr tm)))
  (defun makepl(l / l1)
    (setq l1 (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline")  (cons 90 (length l))))
    (foreach pt l (setq l1 (append l1 (list (cons 10 (dxf 10 pt)) (cons 42 0)))))
    (entmake l1)
  )
  
  (defun dimpl(l / n)
    (setq n -1)
    (repeat (1- (length l))
      (command "dimaligned" (dxf 10 (nth (setq n (1+ n)) l)) (dxf 10 (nth (1+ n) l)) (dxf 10 (nth n l))))
  )
 
  (defun dimpl1(l pl / v tm)
    (setq pl (vlax-ename->vla-object pl))
    (foreach v l
      (setq v (dxf 10 v))
      (if (and (setq tm (vlax-curve-getClosestPointto pl v t))
      (> (vlax-curve-getParamAtPoint pl tm) 0))
(command "dimaligned" v tm v)))
  )
  ;;===========================;;
  (setq os (getvar 'osmode)
pll nil)
  (setvar 'osmode 0)
  (while (setq l (vl-sort (acet-ss-to-list (ssget '((0 . "CIRCLE"))))
  '(lambda(x y) (< (car (dxf 10 x)) (car (dxf 10 y))))))
    (makepl l) (setq pll (append pll (list (list (entlast) l)))) (dimpl l)
  )
  (setq n 0)
  (repeat (1- (length pll))
    (setq n (1+ n))
    (dimpl1 (last (nth (1- n) pll)) (car (nth n pll))))
  (mapcar '(lambda(x) (entdel (car x))) pll)
  (setvar 'osmode os)
  (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
pvaqnster    0

Bạn có thể hướng dẫn mình cụ thể hơn 1 chút được không?Mình load được lips vào cad rồi sau đó đánh lệnh tmp rồi chọn các đường tròn trên 1 hàng, sau đó enter mà không hiện gì 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
pvaqnster    0

Mình vừa cài Express tool và đã làm được rồi,không bị lỗi nữa.Để có các đường khoảng cách từ các vòng tròn ở hàng dưới lên hàng trên thì có cách nào làm được không bạn nhỉ.Ngoài ra cho mình hỏi chút là thay vì đối tượng là các đường tròn thì mình muốn các đối tượng đưa vào là các point thì giải quyết thế nào bạn nhỉ.Mình cám ơn bạn rất 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
pvaqnster    0

Mình vừa mở Lips bằng notepad và thay " Circle" bằng " Point" thì đã giải quyết được vấn đề về dữ liệu đầu vào là point.bây giờ chỉ còn 1 khúc mắc duy nhất là muốn có đc các đường khoảng cách từ các vòng tròn ( hoặc point) của hàng liền kề tới hàng bên trên nữa là xong.Cám ơn bạ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
Tue_NV    3.841

Mình vừa mở Lips bằng notepad và thay " Circle" bằng " Point" thì đã giải quyết được vấn đề về dữ liệu đầu vào là point.bây giờ chỉ còn 1 khúc mắc duy nhất là muốn có đc các đường khoảng cách từ các vòng tròn ( hoặc point) của hàng liền kề tới hàng bên trên nữa là xong.Cám ơn bạn nhiều!

 

Tại sao phải là hàng bên trên hả bạn? Nếu điểm từ hàng bên trên "nối xuống" hàng bên dưới thì có đượ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
Tot77    501

Bạn chọn từng dãy một theo thứ tự (trái qua, phải qua, trên xuống hay dưới lên đều được). Chọn xong 1 dãy thì enter, nó sẽ nối các điểm của dãy đó với nhau. Xong hết các dãy thì enter lần nữa sẽ nối các dãy với nhau. Lisp sẽ theo thứ tự dãy bạn chọn để nối từ dảy 1 tời dãy 2, dãy 2 tới dãy 3 ... Tôi có sửa lại líp chút ít phòng trường hợp dãy thẳng đứng.

 

(defun c:tmp(/ os pll l n)
  (defun dxf(id v) (list (car (setq tm (cdr (assoc id (entget v))))) (cadr tm)))
  (defun makepl(l / l1)
    (setq l1 (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline")  (cons 90 (length l))))
    (foreach pt l (setq l1 (append l1 (list (cons 10 (dxf 10 pt)) (cons 42 0)))))
    (entmake l1)
  )
  
  (defun dimpl(l / n)
    (setq n -1)
    (repeat (1- (length l))
      (command "dimaligned" (dxf 10 (nth (setq n (1+ n)) l)) (dxf 10 (nth (1+ n) l)) (dxf 10 (nth n l))))
  )
 
  (defun dimpl1(l pl / v tm)
    (setq pl (vlax-ename->vla-object pl))
    (foreach v l
      (setq v (dxf 10 v))
      (if (and (setq tm (vlax-curve-getClosestPointto pl v t))
      (> (vlax-curve-getParamAtPoint pl tm) 0))
(command "dimaligned" v tm v)))
  )
  ;;===========================;;
  (command "undo" "be")
  (setq os (getvar 'osmode)
pll nil)
  (setvar 'osmode 0)
  (while (setq l (vl-sort (acet-ss-to-list (ssget '((0 . "POINT"))))
  '(lambda(x y) (if (/= (car (dxf 10 x)) (car (dxf 10 y)))
  (< (car (dxf 10 x)) (car (dxf 10 y)))
  (> (cadr (dxf 10 x)) (cadr (dxf 10 y)))))))
    (makepl l) (setq pll (append pll (list (list (entlast) l)))) (dimpl l)
  )
  (setq n 0)
  (repeat (1- (length pll))
    (setq n (1+ n))
    (dimpl1 (last (nth (1- n) pll)) (car (nth n pll))))
  (mapcar '(lambda(x) (entdel (car x))) pll)  
  (command "undo" "e")
  (setvar 'osmode os)
  (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
ndtnv    397

Thuật toán có 2 điều bất ổn:

1 - Điều kiện : (> (vlax-curve-getParamAtPoint pl tm) 0) là thiếu

     Test : chọn hàng theo thứ tự 3, 2, 1

     Lý do: chủ topic không vd cho trường hợp này.

2 - Thuật toán sort theo x

     Test: xoay sao cho điểm đầu và điểm cuối hàng thứ 1 thẳng đứng.

 

Ngoài ra thì việc chọn từng hàng rất mất công (điều này chủ topic không yêu cầu).

Nếu có option để tự động chọn hàng (nếu các điểm không quá zigzag) thì sử dụng nhanh hơn nhiều lần.

Thuật toán:

- Chọn tập hợp điểm

- Chọn điểm đầu, điểm cuối hàng 1 làm trục X

- Sort theo y

- Phân thành từng hàng với sai số nhập vào

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

Mình đã load lips về và đã làm được.Đúng như bạn Ndtnv đã nói ở trên thì việc chọn các đối tượng ở 1 hàng khá tốn công, nếu mà 1 hàng gần nằm ngang hoặc gần thẳng đứng thì chọn đối tượng rất nhanh, nhưng nếu các đối tượng trên 1 hàng mà hơi cong thì phải chọn thủ công,Liệu mình có thể chọn đối tượng bằng cách vẽ 1 đường Pline đi qua các đối tượng đó hoặc gần nhất được không.Ngoài ra bạn có thể giúp mình tích hợp trong Lips để có thể đánh số thứ tự các đối tượng đó theo 1 trật tự ( từ trái qua phải hoặc từ phải qua trái) mà không phải đánh thủ công được không.Mình gửi bản vẽ để các bạn xem giúp mình.Cám ơn các bạn!http://www.cadviet.com/upfiles/3/131616_ban_ve_moi.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
Tot77    501

Thật ra đây là bài toán tìm đường theo hướng gần giống vơi hướng cho sẵn,.

Líp dưới đây gồm 2 lệnh:

1. Lệnh TIM : chọn point 1. point 2, rồi chọn toàn bộ point, líp sẽ tìm đường đi thích hợp theo hướng ban đầu (p1-> p2) đến các điểm lân cận để vẽ pline.

2. Lệnh TMP : Chọn các pline bằng lệnh TIM vừa vẽ, líp sẽ dim các đường và ghi chữ.

 

(defun dxf(id v) (list (car (setq tm (cdr (assoc id (entget v))))) (cadr tm)))
 
(defun c:tmp(/ os n sodem pll)  
  (defun laydinh(v / n L node)
    (setq v (vlax-ename->vla-object v)
          n -1 L nil)
    (vl-catch-all-error-p (vl-catch-all-apply '(lambda() 
      (while (setq node (vla-get-Coordinate v (setq n (1+ n)))) 
        (setq L (append L (list (vlax-safearray->list (vlax-variant-value node)))))))))
    L
  )
  
  (defun dimpl(l / n)
    (setq n -1)
    (repeat (1- (length l))
      (command "dimaligned" (nth (setq n (1+ n)) l) (nth (1+ n) l) (nth n l))
      (maketxt (polar (nth n l) (+ 1.5708 (angle (nth n l) (nth (1+ n) l))) (* 2 (getvar 'textsize)))
      (setq sodem (1+ sodem))))
    (maketxt (polar (nth (1+ n) l) (+ 1.5708 (angle (nth n l) (nth (1+ n) l))) (* 2 (getvar 'textsize)))
    (setq sodem (1+ sodem)))
  )
 
  (defun dimpl1(pl1 pl2 / l tm)
    (setq l (laydinh pl1)
 pl2 (vlax-ename->vla-object pl2))
    (foreach v l  
      (if (and (setq tm (vlax-curve-getClosestPointto pl2 v t))
      (> (vlax-curve-getParamAtPoint pl2 tm) 0))
(command "dimaligned" v tm v)))
  )
 
  (defun maketxt(pt txt)
    (entmake (list (cons 0 "TEXT") (cons 10 pt) (cons 11 pt) (cons 40 (getvar 'textsize))
  (cons 72 1) (cons 73 2) (cons 50 0) (cons 1 (itoa txt)))))
  
  ;;===========================;;
  
  (command "undo" "be")
  (setq os (getvar 'osmode) n 0 sodem 0)
  (setvar 'osmode 0)
  
  (foreach v (setq pll (acet-ss-to-list (ssget '((0 . "*POLYLINE"))))) (dimpl (laydinh v)))
  (repeat (1- (length pll)) (dimpl1 (nth n pll) (nth (setq n (1+ n)) pll)))
    
  (command "undo" "e")
  (setvar 'osmode os)
  (princ)
)
 
(defun c:tim(/ a b c ss lp ang )
  (defun leftl(l n / i) (setq i -1) (vl-remove-if '(lambda(x) (> (setq i (1+ i)) (1- n))) l))
  (defun makepl(l / l1)
    (setq l1 (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline")  (cons 90 (length l))))
    (foreach pt l (setq l1 (append l1 (list (cons 10 (dxf 10 pt)) (cons 42 0)))))
    (entmake l1)
  )
  ;;;
  (setq a (car (entsel "\nChon Diem 1:"))
b (car (entsel "\nChon Diem 2:"))
ss (acet-ss-to-list (ssget '((0 . "POINT,CIRCLE"))))
lp (append nil (list a b))
ss (vl-remove a ss)
ss (vl-remove b ss)
ang (angle (dxf 10 a) (dxf 10 b)))
  (while (setq c (car (vl-remove-if-not '(lambda(x) (< (abs (- (angle (dxf 10 b) (dxf 10 x)) ang)) 0.5))
 (leftl (vl-sort ss '(lambda(x y) (< (distance (dxf 10 b) (dxf 10 x))
     (distance (dxf 10 b) (dxf 10 y))))) 5))))
 
    (setq ang (angle (dxf 10 b) (dxf 10 c))
 lp (append lp (list c))
 ss (vl-remove c ss)
 b c)
  )
  (makepl lp) (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

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  

×