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

Bee

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

    553
  • Đã tham gia

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

  • Ngày trúng

    37

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


  1. Em đang viết một cái lisp để hiển thị thông tin độ dài của 1 đường. 

    Bản vẽ như em đã đính kèm. 

    Ví dụ em click vào đường ống màu xanh nó sẽ tự động kết nối với điểm tiếp theo. http://imgur.com/a/Twr4o

    Trong hình vẽ đường màu xanh có vài nét đứt. Làm thế nào em chỉ cần click 1 lần là nó tự động tính được chiều dài của tất cả các đường màu xanh.

    Bác nào giải được em xin đóng học phí học online ạ. Đang muốn mày mò cái này mà khó quá ạ.

    Chân thành cảm ơn các bác ạ. 

    Đây là link file gốc ạ. https://www.mediafire.com/?a1f8ku72zk42g2s

    Tính độ dài 1 đường thì trên này có nhiều. Search là ra thôi mà. ^_^


  2. Dùng hàm ở trên thì dấu thập phân bị mất. Nên theo ý bác Hạ!

    *** VL-, VLA- ... Tham khảo: http://www.afralisp.net/archive/

    Thập phân và chữ ko dấu thì update cái này của Tharwat ^_^ 

     

    Nói chung là còn nhiều trường hợp nên chủ thớt phải tự xử lý theo ý của mình thôi.

    (defun search (s)
      (vl-list->string
        (vl-remove-if
          '(lambda (x)
    	 (or
    	   (< 64 x 91)
    	   (< 96 x 123)
    	 )
           )
          (vl-string->list s)
        )
      )
    )
    
    • Vote tăng 1

  3. Em có một vấn đề muốn nhờ các cao thủ autolisp giúp đỡ. Ví dụ em có chuỗi text "Chiều dài đoạn là 150.5m" em muốn tách phần số 150.5 ra khỏi chuỗi text. Kính nhờ các cao thủ trợ giúp ạ.

    Search search và search ^_^ tham khảo tí cái này thôi nhé.

     

    (setq number (search "Chieu dai doan la 150.5m"))

    (defun search (s)
      (vl-list->string
        (vl-remove-if
          '(lambda (x) (or (< x 48) (> x 57)))
          (vl-string->list s)
        )
      )
    )
    
    • Vote tăng 1

  4. Cá tính của tôi không bao giờ chơi khăm người khác, trừ khi nó nằm trong mục "đố vui".

    Rất cám ơn Bee và Quocmanh04tt, nhưng tôi chịu, dù cả ngày nay cố gắng GG.

    Cái này như quocmanh nói là gốc tọa độ block gốc là không trùng với 0. nên lisp tính toán sai. Em ít khi bị dính trường hợp này nên ko để ý. Mà có khi e còn không biết tạo cái block khác gốc tọa độ này ntn. ^_^

     

    Cách sửa nếu chui vào BEDIT thì tất cả block đã chèn sẽ bị nhẩy sai hết. Vì vậy chỉ có cách là nổ block cũ và tạo 1 block mới với tọa độ chuẩn 0.. Sau đó thì lisp mới chèn ngược lại các block đã có trong bản vẽ. Đó là cách đơn giản nhất mà e nghĩ được.

     

    Hi vọng ngóng được cách thay đổi tọa độ gốc trong block qua lisp của mọi người mà ko phải làm cách trên.

     

    ^_^


  5.  

    Dùng cho LWPOLYLINE như thế này mà sao nó chuyển sai Bee nhỉ (Line thì OK):

    File test:

    http://www.mediafire.com/file/vdcdleyjkxd08gz/Test.dwg

       ((= "LWPOLYLINE" typ)
        (setq lst
         (cons 
     (list 
      typ 
           (mapcar '(lambda(p) (mapcar '+ ins (mxv mat p))) (mapcar 'cdr (vl-remove-if-not '(lambda(x) (eq (car x) 10)) elst))))
          lst)))
    

    Hì bác cứ đùa e. LW thì ko có z nên nó hiểu sai mà. :) Thêm cho nó 1 mapcar nữa là chuẩn.

    ((= "LWPOLYLINE" typ)
           (setq lst
    	      (cons
    		(list
    		  typ
    		  (mapcar
    		    '(lambda (p) (mapcar '+ ins (mxv mat p)))
    		    (mapcar '(lambda (aa) (append aa (list 0.)))
    			    (mapcar 'cdr (vl-remove-if-not '(lambda (x) (eq (car x) 10)) elst)
    				    )
    			    )
    		    )
    		)
    		lst
    	      )
           )
          )
    

  6. Có cái này đơn giản hơn này:

    (defun c:tt (/ a b c l)

    (cond ((setq a (entsel))

    (and (eq (cdr (assoc 0 (entget (car a)))) "INSERT")

    (setq b (nentselp (cadr a)))

    (eq (cdr (assoc 0 (entget (car B)))) "LWPOLYLINE")

    (setq c (entmakex (entget (car B))))

    (not (vla-transformby (vlax-ename->vla-object c) (vlax-tmatrix (caddr B))))

    (setq l (mapcar 'cdr (vl-remove-if-not '(lambda (x) (eq (car x) 10)) (entget c))))

    (entdel c))))

    l)

    :D

    • Vote tăng 1

  7. Mọi người cho hỏi ngu tí:

    Tôi có 1 block_att chứa 1 pline và 1 att, đem chèn nó vào điểm A, sau đó move qua điểm B. Làm thế nào để lấy tọa độ các đỉnh pline khi chọn block đã move? Vì khi lấy entget của các đối tượng con của block thì tọa độ pline nó lấy tọa độ lúc chèn (điểm A) chứ không phải tọa độ sau move (điểm 'B). Không nổ block nhé.

    Cách khác,

    Bác Hạ tham khảo code này của Giles, pline thì bác thay ngon lành qua matrix ^_^

    ;; Entmatrix
    ;; Returns a list which first item is the 3X3 tranformation matrix and second item
    ;; the insertion point of a block refernce in its owner (space or block definition)
    (defun EntMatrix (ename / elst ang norm)
      (setq	elst (entget ename)
    	ang  (cdr (assoc 50 elst))
    	norm (cdr (assoc 210 elst))
      )
      (list
        (mxm
          (mapcar (function (lambda (v) (trans v 0 norm T)))
    	      '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))
          )
          (mxm
    	(list (list (cos ang) (- (sin ang)) 0.0)
    	      (list (sin ang) (cos ang) 0.0)
    	      '(0.0 0.0 1.0)
    	)
    	(list (list (cdr (assoc 41 elst)) 0.0 0.0)
    	      (list 0.0 (cdr (assoc 42 elst)) 0.0)
    	      (list 0.0 0.0 (cdr (assoc 43 elst)))
    	)
          )
        )
        (trans (cdr (assoc 10 elst)) norm 0)
      )
    )
    
    ;; Blk2Coord
    ;; Returns a list of a block reference entities coordinates
    (defun Blk2Coord (ref mat ins / blk ent lst)
      (setq blk (tblsearch "BLOCK" (cdr (assoc 2 (entget ref)))))
      (setq ent (cdr (assoc -2 blk)))
      (while ent
        (setq elst (entget ent)
    	  typ  (cdr (assoc 0 elst))
        )
        (cond
          ((= "LINE" typ)
           (setq lst (cons (list typ
    			     (mapcar '+ ins (mxv mat (cdr (assoc 10 elst))))
    			     (mapcar '+ ins (mxv mat (cdr (assoc 11 elst))))
    		       )
    		       lst
    		 )
           )
          )
          ((member typ '("POINT" "TEXT"))
           (setq lst (cons (list typ
    			     (mapcar '+ ins (mxv mat (cdr (assoc 10 elst))))
    		       )
    		       lst
    		 )
           )
          )
          ((= "INSERT" typ)
           (setq nent (EntMatrix ent))
           (setq lst
    	      (append
    		lst
    		(Blk2Coord ent
    			   (mxm  mat (car nent))
    			   (mapcar '+ ins (mxv mat (cadr nent)))
    		)
    	      )
           )
          )
          (T nil)
        )
        (setq ent (entnext ent))
      )
      (cons (list (cdr (assoc 2 blk)) ins) lst)
    )
    
    ;; Transpose a matrix Doug Wilson
    (defun trp (m)
      (apply 'mapcar (cons 'list m))
    )
    
    ;; Apply a transformation matrix to a vector by Vladimir Nesterovsky
    (defun mxv (m v)
      (mapcar (function (lambda (r) (apply '+ (mapcar '* r v))))
    	  m
      )
    )
    
    ;; Multiply two matrices by Vladimir Nesterovsky
    (defun mxm (m q)
      (mapcar (function (lambda (r) (mxv (trp q) r))) m)
    )
    
    ;; Main function
    
    (defun c:test (/ ss n ent mtx lst)
      (if (setq ss (ssget '((0 . "INSERT"))))
        (repeat (setq n (sslength ss))
          (setq ent	(ssname ss (setq n (1- n)))
    	    mtx	(EntMatrix ent)
    	    lst	(append (Blk2Coord ent (car mtx) (cadr mtx)) lst)
          )
        )
      )
      (mapcar 'print lst)
      (textscr)
      (princ)
    )
    
    • Vote tăng 1

  8. Em có muốn viết 1 lisp sửa Pline theo 1 pline mẫu nhưng vẫn giữ nguyên  Entity name (theo em hiểu thì thằng này giống IDobject)  của đối tượng sửa nhưng khả năng có hạn nên chưa thể viết được, Mong các anh giúp đỡ em.

     

    32345708423_e9210a25f3.jpg

     

    32315688674_c235b82a37.jpg

    Sao phải giữ nguyên ID. Phức tạp hóa vấn đề nhỉ ? Offset thằng tím ra xong matchprop thằng xanh cho thằng mới là xong. ^_^


  9. Cám ơn các bác đã góp ý cho em học hỏi đc thêm nhiều điều, em có một mong muốn cải tiến nho nhỏ cái líp trên nữa.. giúp em viết thêm 2 dòng này với

    - Lấy màu của Text đối tượng để đưa vào màu cho block vừa insert vào.

    - Nếu ko có block "CODE_COL" trong bản vẽ thì báo về "Chua khoi tao block CODE_COL".

    Em xin cám ơn!!!!

    1. Bạn nên post dwg ví dụ thì làm nhanh hơn rất nhiều.

    2. Để thay đổi màu att có nhiều cách: command BATTMAN hoặc BEDIT xong dùng ATTSYNS là thay hết màu......

    • Vote tăng 1

  10. Mình đang làm bản vẽ thì bị dính cái này lâu rồi nhưng không rõ sửa ra sao. Cụ thể là mình vẽ shop cho một công ty Hàn, khi copy từ bản vẽ này sang bản vẽ kia thì đi theo là vô vàn block. Dùng lệnh PU không xóa được. Cũng không hiện trong block editor. Ctrl + A ròi xóa hết bản vẽ cũng ko hết. Dung lượng bản vẽ thì rất nặng ( 18 đến 60 mb. có bản đến 90 mb) Ai biết sửa thì giúp mình cái

    https://drive.google.com/file/d/0B_gvmtf7vpDaWDE3SEN3YlFiV3c/view?usp=sharing

    Link bản vẽ mọi người giupsm ình với. Thanks trước

    Vẫn dùng lệnh PU nhưng tick vào ô: Automatically purge orphaned data là hết block lởm khởm ngay ^_^ Sau khi PU còn có 99Kb

    • Vote tăng 2

  11. Thưa các bác, kiểu là em có sẵn 1 block CODE_COL vs 4 attribute

    -Tên_cột

    -Cao_đáy

    -Cao_đỉnh

    -Trừ_cao

    và mặt bằng có text tên cột C1, C2... Cn. Em muốn chọn tất cả các text tên cọc và chạy LISP để biến tất cả các text tên cột đó thành block CODE_COL vs tên cột được đưa vào attribute Tên_cột... bác nào đi qua giúp dùm em với, em xin cám ơn trc!

    Nghịch tí nào. Lisp yêu cầu là đã có block CODE_COL trong bản vẽ nhé. ^_^

    (defun c:test (/ osm ss n value ins)
      (setq osm (getvar 'osmode))
      (if (setq ss (ssget '((0 . "TEXT"))))
        (progn
          (setq n 0)
          (repeat (sslength ss)
    	(setq value (cdr (assoc 1 (entget (ssname ss n)))))
    	(setq ins (cdr (assoc 10 (entget (ssname ss n)))))
    	(mapcar 'setvar (mapcar 'vl-list->string (list '(65 84 84 68 73 65) '(79 83 77 79 68 69))) '(0 0))
    	(command "insert" "CODE_COL" ins 1 1 0 value "" "" "")
    	(entdel (ssname ss n))
    	(setq n (1+ n))
    	)
          )
        (princ "\nBan da khong chon text.")
        );if
      (setvar 'osmode osm)
      (princ)
      )
    
    • Vote tăng 1

  12. Chào mọi người. Cho mình hỏi ké vào đây với chẳng mình chưa biết cách tạo bài việt trên diễn đàn.

    Mình đang vẽ 2d một sảng phẩm, mình xuất từ NX sang, nhưng giờ mình muốn copy 3 hình chiếu trên bản cad đó ra 3 file riêng lại ko copy được.

    ( mình copy nhưng lúc nào cũng chỉ copy được một hình chiếu thôi).

    Bạn nào biết các sửa thì chỉ cho mình với. và có thể copy ra 3 file hộ mình với ạ. Mình xin cả ơn.

    http://www.mediafire.com/file/9000eyvu4wa2ktd/sanphamlamdoan.dwg

    https://drive.google.com/file/d/0B-3fZ45DSr_XMGMzUnJETkhhWGs/view?usp=sharing

     

    Xuat thành 2D luôn ^_^


  13. Xin chào các bác. Em muốn xác định 2 đỉnh đối nhau của khung tên được Xref để làm lisp IN [ lisp in chỉ quét khung tên được chọn thì tự bắt 2 đỉnh để preview hoặc in với đk mình đã ADDlayout từ trước ]. Mong các bác chỉ giáo thêm, em xin cảm ơn

    Có thể dùng box của Lee nhé. ^_^

    Code here:

    (defun c:test ( / ent )
        (if (setq ent (car (entsel)))
            (entmake
                (append
                   '(
                        (000 . "LWPOLYLINE")
                        (100 . "AcDbEntity")
                        (100 . "AcDbPolyline")
                        (090 . 4)
                        (070 . 1)
                    )
                    (mapcar '(lambda ( p ) (cons 10 p)) (LM:boundingbox (vlax-ename->vla-object ent)))
                )
            )
        )
        (princ)
    )
    (vl-load-com) (princ)
    
    ;; Bounding Box  -  Lee Mac
    ;; Returns the point list describing the rectangular frame bounding the supplied object.
    ;; obj - [vla] VLA-Object
    
    (defun LM:boundingbox ( obj / a b lst )
        (if
            (and
                (vlax-method-applicable-p obj 'getboundingbox)
                (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-getboundingbox (list obj 'a 'b))))
                (setq lst (mapcar 'vlax-safearray->list (list a b)))
            )
            (mapcar '(lambda ( a ) (mapcar '(lambda ( b ) ((eval b) lst)) a))
               '(
                    (caar   cadar)
                    (caadr  cadar)
                    (caadr cadadr)
                    (caar  cadadr)
                )
            )
        )
    )
    

  14. Xin các chuyên gia CAD giúp đỡ.

    Mình có một mặt bằng Ngũ Giác A,B,C,D,E ( không phải ngũ giác đều) đã có tất cả chiều dài từng đoạn.

    Các góc đo không có. Làm sao mình dựng được hình này lên Autocad. Mục đích là mình dựng lên Autocad để lấy tọa độ.

    Xin cảm ơn nhiều.

    Trường hợp tổng quát như bác Hạ nói là đúng. Nhưng trong trường hợp cụ thể: có thể scan thành jpg, vẽ gần đúng góc và chính xác cạnh thì có thể vi chỉnh gần đúng được. Tóm lại là post hình lên rồi mọi người sẽ dựng CAD gần đúng nhất cho ^_^

×