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

ngokiet

Thành viên
  • Số lượng nội dung

    377
  • Đã tham gia

  • Lần ghé thăm cuối

  • Ngày trúng

    38

Bài đăng được đăng bởi ngokiet


  1. Vào lúc 28/10/2016 tại 12:25, vandv đã nói:

    Khi copy block từ bản vẽ này [1] sang bản vẽ khác [2] đã có sẵn block trùng tên thì block trong bản vẽ 2 vẫn giũ nguyên. Làm thế nào thay thế block của bản vẽ [2] bằng block của bản vẽ [1] mà không phải đổi tên block không. Mình update bản vẽ copy nhiêu block qua bản vẽ khác cùng lúc nên đổi tên từng block khá mất thời gian. Giúp mình với

    Làm ngược lại. Lấy bản vẽ 1 xóa sạch rồi chen bàn vẽ 2 vào. Nếu sửa nhiều block.

    Còn không thì wblock đó ra rồi các bàn vẽ khác kéo thả block đó vào.

     

    Còn có 1 cách nữa là nhấn Ctrl+2. mở tới bản vẽ 1 - blocks . Nhán nút phải trên block đã sửa chọn redefine only

     

    image.png

    • Like 1

  2. 21 phút trước, Huyminer đã nói:

    tập hợp các điểm của mình không đơn thuần là nó chạy theo trục XY

    Các tập điểm có thể chạy xiên như này chứ không thẳng hàng nên phép chiếu và so sánh các điểm với trục x và y mình đã thử rồi và không thành công

     

    Ít nhất bạn phải có file cho người ta test chứ.

    Trong các điểm bạn đưa thì gần như không có quy luật nào chính xác. Bạn phải tìm 1 quy luật tương đối gần đúng với nó nhất để sort.

    Bạn dề xuất sort theo x+y thì không đúng rồi. Theo mình thấy là nên xoay trục tọa đô rồi sort

     


  3. 4 giờ trước, TranAnhTuong đã nói:

     

     

    Bác cho em xin Lisp ah! Em cảm ơn bác nhiều!

    Mấy bác đang chào hàng đó. Liên hệ đặt mua đi. Liên hệ tốt không chừng được miễn phí hi hi. Dạo náy cadviet nhiều người nhờ vả nhưng thiếu ý tứ với người giúp nên cũng ít viết dùm rồi.

    • Like 1

  4. Bạn thử lệnh

    (getvar "MILLISECS") ; xem mili giây hiện hành

    (rtos (getvar "cdate") 2 6) ; Xem năm thang ngay giờ phút giây 

    Autolisp không có hàm delay. Vì vậy bạn có thể dùng

    (while (eq (getvar 'cdate) x)) hay (while (eq (getvar"MILLISECS") x)) Để đợi tới thời điểm nào đó.

    HÌnh như cdate chính xac theo giây.  millisecs chính xác theo %giây.


  5. (defun c:ff(/ e1 e2 p1 p2 break)
      (defun break(en / ob)
        (setq ob (vlax-ename->vla-object en)
    	  p1 (vlax-curve-getparamatpoint ob
    	       (vlax-curve-getclosestpointto ob (trans p1 1 0)))
    	  p2 (vlax-curve-getparamatpoint ob
    	       (vlax-curve-getclosestpointto ob (trans p2 1 0))))
        (If (> p1 p2) (mapcar 'set '(p1 p2) (list p2 p1)))
        (setq p1 (1+ (fix p1))
    	  p2 (fix p2))
        (if (eq p1 p2)
          (command "breaK" (list en (setq p1 (vlax-curve-getpointatparam ob p1))) p1)
          (progn
    	(command "breaK" (list en (setq p2 (vlax-curve-getpointatparam ob p2))) p2)
    	(command "breaK" (list en (setq p1 (vlax-curve-getpointatparam ob p1))) p1))))  
        
      (if (and (mapcar 'set '(e1 p1) (entsel "Chon 1:"))
    	   (mapcar 'set '(e2 p2) (entsel "Chon 2:")))
        (progn
          (command "Fillet" p1 p2)
          (if (null (entget e1)) (break e2)
    	(if (null (entget e2)) (break e1)))
          (princ))))

    Viết nhanh theo kiểu bác Đoàn. Làm sơ sơ nên nếu 2 đối tượng khác màu / layer nhau thì sẽ mất 1 đối tượng.

    • Like 1

  6. 4 giờ trước, nghia7x đã nói:

    đúng rồi bác nhưng để mà được như "sau" thì mình phải dùng cả Trim + Extend , BR+ BF thì mới ra đc , còn dùng fillet thì nó nhập làm 1 mất tiêu ( Cad 16) . Ông trong cty dùng Cad 10 thì nối được bằng fillet nhưng ko nhập thành 1

    Trim/Extend thì có thể chung 1 lệnh. ví dụ như Trim thì nhấn Shift là Extend và ngược lại. Bạn có thể chọn kiểu Extend edge của trim/extend để dễ sài hơn.

    Còn viết lisp thì phức tạp. Mình không có cad 10 để test thử nhưng mình nghĩ nó là lisp. Nếu máy sài được thì có lisp sẳn nên lấy sài tiếp thôi. Chứ viết lisp này cũng khá phức tạp nếu viết kỹ.

    Mình viết cho bạn 1 đoạn lisp ngắn là break polyline tại 1 điểm

    (defun c:bb(/ p) (command "BREAK" (setq p (getpoint)) p))

    Có thể dùng ngắt polyline sau fillet/chamfer.


  7. 8 giờ trước, Duong Nhat Duy đã nói:

    Mình muốn viết 1 lisp Fillet 2 đối tượng khác cao độ (trc khi fillet cho cao độ về 0)

    Mình muốn nó như 1 lệnh Fillet xịn trong command.

    Mình định dùng pause nhưng ko biết có cách nào lấy thông tin nhập liệu từ người dùng qua lệnh pause ko, giả sử bên dưới mình muốn lấy thông tin của 2 đối tượng fillet thì làm ntn:

    • cadvietlisp.lsp
      lisp help
    •  
    
    (command "FILLET")
    (while (= (logand (getvar "CMDACTIVE") 1) 1)
      (command pause)
      )

    Hoặc là có cách tiếp cận nào khác không ?

    Các bạn giúp mình nhé, cảm ơn !

    Cách đơn giản có thể là chuyển tất cả dối tượng trên bản vẽ về cao độ 0 rồi thực hiện lệnh. Cách khó là tự viết lại 2 hàm trên.

    Còn muốn giữ preview thì ko dc.

    • Vote tăng 1

  8. Hic mấy bác cũng hay thật. Mình đọc chỉ hiểu sơ được ý chủ thớt thôi. Theo mình thì bài toán này có mấy trường hợp.

    - Chiều dài được tính là theo khoảng cách hay chiều dài. (Vd như arc length hay distance khoảng cách điểm đầu điểm cuối.

    - Khoảng 2 đầu được vẽ như thế nào khi chiều dài lẻ.

    - Khi Pline kín mà khoảng cách lẻ thì vẽ như thế nào?

    Theo AutoCad thì linetype nó vẽ theo chiều dài. Lypetype generation thì nó xác định theo toàn đường hay từng đoạn.

    Phần 2 đầu thì nó làm phần dư. Nếu pline khép kín thì nó chuyển qua chia đều.

    Mình viết thử 1 phương án khoảng cách theo length, Nhưng trim luôn 2 đầu. Không chạy được với Pline - Fit/smooth( Với đường này cần explore nó ra rồi join lại sẽ chạy được)

    Các đường khác như circle,arc, elip, elip arc, spline chạy bình thường.

    Lisp sử dụng command break nên chạy hơi chậm.

    (defun c:br1(/ oso l1 l2 l0 n ob)
      
      (initget 0 "5x5 10x10 20x10")
      (mapcar 'set '(l1 l2)
    	  (nth (vl-position (cond ((getkword " Chon [5x5/10x10/20x10]:"))
    				  ("5x5"))
    		 '("5x5" "10x10" "20x10"))
    	       '((5 10) (10 20) (20 30))))
      (setq oso (getvar 'osmode))
      (setvar 'osmode 0)
      (foreach ex (acet-ss-to-list (ssget))
        (if (/= (setq ob  (vlax-ename->vla-object ex)
    		  Len (vlax-curve-getdistatparam ob (vlax-curve-getendparam ob))
    		  n   (fix (/ (- len l1) l2))
    		  l0  (/ (- len l1 (* n l2)) 2)) 0)
          (progn
    	(command "break" (list ex (vlax-curve-getpointatdist ob (- len l0))) (vlax-curve-getendpoint ob))
    	(command "break" (list ex (vlax-curve-getstartpoint ob)) (vlax-curve-getpointatdist ob l0))))
        (repeat n
          (command "break" (list ex (vlax-curve-getpointatdist ob l1)) (vlax-curve-getpointatdist ob l2))
          (setq ex (entlast)ob (vlax-ename->vla-object ex))))
      
      (setvar 'osmode oso)
      (princ))

     

     

    • Like 2
    • Vote tăng 1

  9. (defun acos (x) (if (<= -1 x 1) (atan (sqrt(- 1 (* x x))) x)))
    (defun gg(a b c)
      (if (and (/= a 0) (/= b 0))
        (acos (/ (- (+ (* a a) (* b b)) (* c c)) (* 2 a b)))))
    (defun cdtg(en / lp d ag a0 a1)
      (setq en (entget en))
      (if (and (eq (cdr (assoc 0 en)) "LWPOLYLINE")
    	   (eq (cdr (assoc 90 en)) 4)
    	   (eq (cdr (assoc 70 en)) 0)
    	   (setq lp (mapcar 'cdr (vl-remove-if-not '(lambda(x) (eq (car x) 10)) en))
    		 d  (mapcar 'distance lp (cdr lp))
    		 ag (apply 'gg d)))
        (progn
          (setq a0 (if (> (sin (- (angle (cadr lp) (caddr lp)) (setq a1 (angle (cadr lp) (car lp))))) 0) (+ a1 ag) (- a1 ag))
    	    lp (list (car lp) (cadr lp) (polar (cadr lp) a0 (cadr d)))
    	    en (vl-remove-if '(lambda(x) (vl-position (car x) '(10 40 41 42 91))) en))
          (entmod (append
    		(subst '(90 . 3) '(90 . 4) (subst '(70 . 1) '(70 . 0) en))
    		(apply 'append
    		       (mapcar '(lambda(x) (cons (cons 10 x) '((40 . 0) (41 . 0) (42 . 0) (91 . 0)))) lp)))))))
    (defun c:pl2tg()
      (cdtg (car(entsel)))
      (princ))
    (defun c:tg(/ en n)
      (setq en (entlast) n 4)
      (while (entnext en) (setq en (entnext en)))
      (command "pline" pause)
      (while (/= (getvar 'cmdactive) 0)
        (if (> (setq n (1- n)) 0) (command pause) (command "")))
      (if (/= en (entlast)) (cdtg (entlast)))
      (princ))

    Buổi sáng code nhanh cho bạn.

    - Lệnh pl2tg: Chuyển đỗi polyline có 3 cạnh (4 dỉnh ,  open) thành pl tam giác có chiều dài 3 cạnh bằng 3 cạnh pl.

    - Lệnh tg. Vẽ tam giác bằng cách vẽ pl 3 cạnh trên.

    * Lưu ý là cạnh đầu tiên pl sẽ không đổi, điểm thứ 3 sẽ định hướng tam giác.

     Nếu xác định được tam giác sẽ chuyển nếu ko thì thôi.

    • Like 1
    • Vote tăng 1

  10. 4 giờ trước, Tai8998 đã nói:

    chào các anh ,em muốn hỏi về vòng lặp

    khi lặp n lần dùng hàm ( repeat ( 1+ n))

    vậy khi muốn chương trình chạy từ 1 đến n rồi sau đó quay về  (n-1) và về 1 thì cú pháp như nào ạ

    mong m.n giúp đỡ ạ

    (repeat (1+ n)   (hàm) ) thì nó chạy n+1 lần. Giá trị n không thay đổi.

    Còn muốn chạy từ 1->n và trở về lại 1 thì nó chạy 2n-1 lần. nên đơn giản là (repeat (1- (* 2 n)) (hàm)) thôi.

    Còn muốn có biến thay đổi từ 1->n và ngược lại thì tạo biến thôi.

     

                

     

     


  11. 46 phút trước, DuongTrungHuy đã nói:

    À cám ơn Doan Nguyen Van nhé. Thì ra là vậy.

     

    Hì ý là 2 hình có chu vi 1 cái là 12.0 và 1 cái 12.0000001 mà lại cho rằng 2 hình này bằng nhau. 

    Thì đúng rồi cái này chạm đến sai số thì thua thật, mà thật, nếu có 2 hình như thế thì mình cũng cho = thôi vì không có ý nghĩa thực tế lắm.

    Thực ra về số, khái niệm bằng nhau cũng chỉ có đối với số nguyên, còn với số thực thì khái niệm = chỉ là tương đối.

    Mà Bạn nói xét thêm các góc nhỡ nó cũng sai nhau cách 0.0000001 mà mình cho nó = cũng sai. Thôi thì vậy là quá xui cho nó rồi cho nó = nhau thôi (đùa tí).

     

    Còn ý bạn về cái cặp cạnh tương ứng, nếu Bạn làm vậy thì đúng dài mất thời gian thật.

    Cám ơn Bạn nhé. Chúc công việc tốt đẹp.  

    Ví dụ như 2 hình này thì theo cách lisp của bạn là bằng nhau?

     

    new block.dwg


  12. Mình có viết thử 1 chút.

    (defun c:sspline(/ en1 en2 infopl sspl)
      (defun infopl(en / d a b p tm)
        (mapcar '(lambda(x)
    	       (Cond ((eq (car x) 10) (setq p (append p (list (cdr x)))))
    		     ((eq (car x) 42) (setq b (append b (list (cdr x)))))))
    	    en)
        (setq d (mapcar 'distance p (append (cdr p) (list (car p))))
    	  a (mapcar 'angle (cons (last p) p) p)
    	  a (mapcar '- a (cons (last a) a))
    	  a (mapcar '(lambda(x) (if (< x 0) (+ x pi pi) x)) a))
        (list (cdr (assoc 70 en)) d a b))
      (defun sspl(s1 s2 / n ss1 ss2 rex s3 k)
        (defun rex(x) (append (cdr x) (list (car x))))
        (defun ss1(s1 s2 eqn) (vl-every '(lambda(a b) (equal a b eqn)) s1 s2))
        (defun ss2(s1 s2 / sc)
          (setq sc (/ (caar s1) (caar s2)))
          (if (and (vl-every '(lambda(a b) (equal sc (/ a b) 1e-12)) (car s1) (car s2)) ; So saanh canh
    	       (ss1 (cadr s1) (cadr s2) 1e-8) ; So sanh goc
    	       (ss1 (caddr s1) (caddr s2) 1e-8)); So sanh bul
    	sc))
        (if (and
    	  (eq (car s1) (car s2))
    	  (eq (setq n (length (cadr s1))) (length (cadr s2))))
          (progn
    	(if (eq (car s1) 0) (setq n 1))
    	(setq s1 (cdr s1) s2 (cdr s2)
    	      s3 (mapcar 'reverse (list (car s1) (mapcar '(lambda(x) (- (+ pi pi) x)) (cadr s1)) (mapcar '- (caddr s1))))
    	      s3 (list (car s3) (rex (cadr s3)) (caddr s3)))
    	(while (and (not (or (setq k (ss2 s1 s2))
    			     (setq k (ss2 s3 s2))))
    		    (/= (setq n (1- n)) 0))
    	  (setq s1 (mapcar 'rex s1)
    		s3 (mapcar 'rex s3)))
    	k)))
      (if (and (setq en1 (car (nentsel "Select pline 1:")))
    	   (eq (cdr(assoc 0 (setq en1 (entget en1)))) "LWPOLYLINE")
    	   (setq en2 (car (nentsel "Select pline 2:")))
    	   (eq (cdr(assoc 0 (setq en2 (entget en2)))) "LWPOLYLINE"))
        (if (setq en1 (sspl (infopl en1) (infopl en2)))
          (alert (strcat "2 Polyline dong dang ti le canh " (rtos en1)))
          (alert (strcat "2 Polyline khong dong dang " )))))

    - Chỉ xét đồng dạng. chưa xét đối xứng.

    - Viết theo kiểu xét các cạnh và góc bằng nhau.

    - Có so sánh luôn polyline cả line và arc.

    Có sai 1 chút nhưng chưa rảnh đề sửa là nếu open PL thì lỡ so sánh luôn bulge cuối không có cạnh. Và chưa so sánh luôn phần đối xúng.


  13. 6 giờ trước, Doan Nguyen Van đã nói:

    E giải quyết đc rồi, bác cũng có thể viết mà, có khi còn trường hợp nào xót thì sao.

    hinh4.png.78763ac19fece0ce144ecf4799e1e414.png

    Chắc là vậy đó bác, e còn bước so sánh đường tròn ngoại tiếp cho chắc

    Không biết chủ thớt có phân biệt hình đối xứng nhau không? Ví dụ 2 tam giác đối xứng nhau thì có đầy đủ tính bạn xét nhưng chiều quay ngược nhau.

     


  14. 2 phút trước, Doan Nguyen Van đã nói:

    Đây là 1 trường hợp đạt đủ các điều kiện: Diện tích, chu vi, thứ tự các cạnh bằng nhau, số đỉnh bằng nhau, nhưng vẫn không phải giống nhau.

    ·- Vấn đề là mình hỏi là đã giải quyết các vấn đề này chưa thôi?

    Chứ có vấn đề là giải quyết được hết.

    Vì mình tính viết thử nhưng có bạn viết rồi thôi.

    Cách suy nghĩ mình so sánh đa giác là dựa trên n cạnh và n góc. Cho nên khi so sánh cũng đơn giản. Nếu tìm hình đồng dạng thì góc không thay đổi chỉ tính tỉ lệ cạnh. Cách dịch chuyển hay đảo chiều cũng dễ.

     


  15. 10 phút trước, Doan Nguyen Van đã nói:

    Vừa nãy e có sửa bên trên rồi ạ.

    Nếu lấy danh sách đỉnh để so sánh thì rất tốn công sắp xếp các tổ hợp đỉnh có thể xảy ra nên e không dùng đỉnh để xác định.

    Tất nhiên vì như thế nên nếu có 2 tam giác như bác nói thì vẫn sẽ nhận biết là giống nhau 

    Mình hỏi trước đó là ví dụ như tứ giác bất kỳ ABCD thì vẽ ngược lại DBCA hay thứ tự đỉnh khác là CDAB thì tứ giác đó giống nhau nhưng lisp phân biệt hay thống kê chung luôn?

    Thật sự thì cũng dễ nhưng để khỏi sót thôi. Thay vì so sánh 1 lấn thì phải so sánh nhiều lần hơn thôi. (n cạnh thì so sánh 2n lần). Tuy nhiên nếu sơ bộ diện tích, chu vi kiểm tra trước thì cũng ít phải so sánh.

×