Đến nội dung


Hình ảnh

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


  • Please log in to reply
14 replies to this topic

#1 pvaqnster

pvaqnster

    biết zoom

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

Đã gửi 05 June 2014 - 03:28 PM

các bác xem bản vẽ và tư vấn giúp em với!


  • 0

#2 pvaqnster

pvaqnster

    biết zoom

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

Đã gửi 05 June 2014 - 03:29 PM

http://www.cadviet.c...1616_ban_ve.dwg


  • 0

#3 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 05 June 2014 - 08:19 PM

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

  • 0

#4 pvaqnster

pvaqnster

    biết zoom

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

Đã gửi 05 June 2014 - 09:37 PM

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.


  • 0

#5 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 05 June 2014 - 10:03 PM

Nó có báo lỗi gì không?
  • 0

#6 pvaqnster

pvaqnster

    biết zoom

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

Đã gửi 05 June 2014 - 10:18 PM

nó báo lỗi error: no function definition: ACET-SS-TO-LIST


  • 0

#7 pvaqnster

pvaqnster

    biết zoom

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

Đã gửi 05 June 2014 - 10:20 PM

Khi mình đánh lệnh tmp rồi enter , sau đó chọn các đường tròn trên 1 hàng rồi enter thì nó hiện lỗi no function definition: ACET-SS-TO-LIST


  • 0

#8 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 05 June 2014 - 10:38 PM

Vậy là do máy bạn ko cài ẽpress, để mai tôi sửa lại.
  • 0

#9 pvaqnster

pvaqnster

    biết zoom

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

Đã gửi 05 June 2014 - 11:07 PM

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.


  • 0

#10 pvaqnster

pvaqnster

    biết zoom

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

Đã gửi 05 June 2014 - 11:27 PM

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!


  • 0

#11 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 06 June 2014 - 05:45 AM

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?


  • 0

#12 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 06 June 2014 - 07:58 AM

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

  • 0

#13 ndtnv

ndtnv

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 437 Bài viết
Điểm đánh giá: 384 (khá)

Đã gửi 06 June 2014 - 09:28 AM

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


  • 0

#14 pvaqnster

pvaqnster

    biết zoom

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

Đã gửi 06 June 2014 - 09:04 PM

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.c..._ban_ve_moi.dwg


  • 0

#15 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 08 June 2014 - 05:30 PM

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

  • 1