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

nguoi_tho_mo

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

    41
  • Đã tham gia

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

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


  1. Hẹn bạn tuần tới tại dạo này mình bị ngập việc quá lên dd dòm ngó thì được chứ viết ra khung thì cũng phải suy nghĩ cho nó tổng quát 1 chút.

    Cảm ơn anh nhiều, măm mới tết đến rồi. cv ai cũng gấp rút.

    Em sẽ làm theo hướng dẫn của anh và dùng như thế vì anh còn nhiều việc khác nên ko dám hỏi thêm nữa ,

    khi nào em nghiên cứu dc nhiều nhiều một chút sẽ share lên diễn đàn

    Chúc anh vui vẻ


  2. Bạn thử cái này nhé. Mình để chiều cao Dim mặc định là bằng 1/150 chiều rộng (ngắn) của blok khung tên. Chiều cao Text cao hơn Dim là 1,2 lần

     

    (defun BatDau() (setq OldOs (getvar "osmode")) (setvar "osmode" 0))
    (defun KetThuc() (setvar "osmode" OldOs)(princ))
    (defun moddxf (dxf chdxf ss) (entmod (subst (cons dxf chdxf) (assoc dxf (entget ss)) (entget ss))))
    ;=========== FIX DIM TEXT ===========;
    ;Chinh chieu cao cua dim & text theo ;
    ;chieu rong(ngan) cua block khung ten;
    ;Mac dinh la = 1/150 chieu rong k/ten;
    ;====================================;
    (defun c:ft (/ Rec pt1 pt2 rpt1 rpt2 rpt3 rpt4 dis12 dis14 dis toadodinh 
    caodim tilechu textgap dimxtend i el1 el ssd en OldOs OldEcho )
    (vl-load-com)
    (setq OldEcho (getvar "cmdecho")) 
    (setvar "cmdecho" 0)
    (command "undo" "be")
    (princ "\n      From nguyentuyen6 @CadViet ")
    (princ "\n Cai Express-Tools truoc khi su dung!!!")
    (setq Rec (acet-ent-geomextents (car (entsel "\nChon block khung ten:")))
    	  pt1 (nth 0 Rec);lay dinh               *-----pt2
    	  pt2 (nth 1 Rec);lay dinh               | khung |
    	  i 0);setq                              pt1-----*	
    ;-----acet-ent-geomextents:diem thap nhat trai va cao nhat phai, ve hcn
    (BatDau)
    (command "RECTANG" pt1 pt2)
    (KetThuc)	
    (setq el1 (entlast));el1
    ;-----lay tile, mac dinh la :1
    (setq
     tileft (cond (tileft) (1))
     tileftold tileft
     tileft   (getreal (strcat "\nChon ty le <"(rtos tileftold 2 2)">: "))
    )
    (if (= tileft nil) (setq tileft tileftold))
    ;-----lay dinh HCN = acet-geom-vertex-list
    (setq toadodinh (acet-geom-vertex-list el1);    	  rpt4----rpt3
    	  rpt1 (nth 0 toadodinh);lay dinh                  |  el1 |
    	  rpt2 (nth 1 toadodinh);lay dinh                 rpt1----rpt2
    	  rpt3 (nth 2 toadodinh);lay dinh 
    	  rpt4 (nth 3 toadodinh);lay dinh
    	  dis12 (distance rpt1 rpt2)
    	  dis14 (distance rpt1 rpt4));setq
    ;----- Chia truong hop khung ngang va khung doc
    (if (> dis12 dis14)		  
    	  (setq caodim (* tileft (/ dis14 150)));T
    	  (setq caodim (* tileft (/ dis12 150)));F
    ) ;if
    (setq textgap (/ caodim 2); k/c tu Text den duong Dim
      dimxtend (/ caodim 2);k/c dau dim 
      tilechu (* caodim 1.2); cao Text so voi cao Dim(text)
      ) 
    ;-----	
    (command "ERASE" el1 "");xoa hcn		 
    (princ (strcat "\nDim:<" (rtos caodim 2 0) ">. Text:<" (rtos tilechu 2 0) ">. Chon Dim & Text can Fix:"))
    ;======================= M A I N =============================
    (setq ssd (ssget '((0 . "DIMENSION,TEXT")))); loc dim text
    (while (< i (sslength ssd))
    (setq en (ssname ssd i))
    ;---- Text -----
    (if (= (cdr (assoc 0 (entget en))) "TEXT")
    	(moddxf 40 tilechu en)
    );if
    ;-- DIMENSION -----
    (if (= (cdr (assoc 0 (entget en))) "DIMENSION")
    	(progn 
    		(setq el (vlax-ename->vla-object en))
    		(vlax-put-property el 'ScaleFactor 1); chinh Scalefactor
    		(vlax-put-property el 'textheight caodim); chieu cao text trong dim
    		(vlax-put-property el 'textgap textgap); k/c tu Text den duong Dim
    		(vlax-put-property el 'ArrowheadSize dimxtend); do lon mui ten
    		(vlax-put-property el 'DimensionLineExtend dimxtend);k/c 2 ben duong dim
    		(vlax-put-property el 'ExtensionLineExtend dimxtend);k/c duong giong dim -> duong dim
    		(vlax-put-property el 'Arrowhead1Block "ArchTick"); loai mui ten
    		(vlax-put-property el 'Arrowhead2Block "ArchTick"); loai mui ten			
    	);progn						  
    );if					  
    (setq i (1+ i))	 
    );while
    ;---------------
    (command "undo" "e")
    (KetThuc)
    (setvar "cmdecho" OldEcho)
    (princ "\n...Done...")
    (princ)
    );defun

    Rất hiệu quả.

    Xin cảm ơn bác.

    Chúc bác nghiên cứu thêm nhiều ứng dụng hơn nữa

    • Vote tăng 1

  3. Chào bạn nguoi_tho_mo. Không biết bạn đã làm đc cái Block chứa FIELD kia chưa. Nếu chưa thì để mình hướng dẫn luôn.

    Còn vấn đề vẽ trong MODEL mà ta hay scale khung với tỉ lệ khung bất kỳ mà khi muốn in ra các DIM và TEXT luôn bằng nhau thì mình cũng đã từng mắc phải. Mình có viết 1 lisp để làm việc này. Nếu bạn cần thì mai mình úp lên cho bạn tham khảo. Khi dùng líp này thì dù khung có scale bao nhiêu đi nữa thì in ra TEXT và DIM vẫn cứ bằng nhau. hề hề.

    Cảm ơn bác Nguyentuyen6

    Field em làm dc từ ngay lúc đó.

    có lisp thì càng tuyệt vời hơn

    Rất mong bác sớm up lên sớm cùng chia sẻ và hoàn thiện.


  4. Chắc phải nhờ các bác thạo về lisp viết thôi

    Cách làm thủ công của em là:

    Tạo thêm một kiểu Dim mới bằng cách thay đổi giá trị trong:

    1- Use overall scale op: (Trong thẻ Fit)

    2 - Scale factor ( Trong thẻ Primary Units

     

    Sau khi Scale hình vẽ xong ta dùng lệnh MA quét kích thước theo một kích thước của kiểu dim vừa tạo là được.

    Dim của em để trong block thì ko dc nữa bác nhé


  5. Cái này dùng FIELD là đc mà bạn. Mình thử 1 cái này xem có đúng ý bạn ko nhé. Scale xong thi` REGEN nhe'

    http://www.cadviet.com/upfiles/3/up_1.dwg

    Chào bác nguyentuyen6

    Rất cảm ơn bác

    Chính xác bác ạ.

    Vậy là số 1 này có thuộc block khung tên hay không hử nguoi_tho_mo????

    Khi scale thì chọn cả khung tên và cái số 1 ấy à??? Các text khác trong khung tên thì sao????

    Hề hề hề, nghĩ cho kỹ rồi đặt yêu cầu chứ đừng có Phát sinh kiểu nớ, khó đoán lắm.....

    dùng các này ta có thể lựa chọn dim, text... phù hợp để khi in ra giấy chiều cao chữ là tieu chuẩn mà không phải thử nhiều lần các bác nhá.

    "Hề Hề Hề" không cần nhìn nick bít ngay là bác rồi

    nghĩ cho kỹ rồi đặt yêu cầu chứ

    Bác nguyentuyen6 nghĩ giúp bác cháu ta rồi

    Bác nào giải quyết giúp vụ khi scale luôn là số đặc biệt (1, 2, 4, 5, 10, 20,) được không ạ


  6. Chào nguoi_tho_mo,

    Bạn hãy thử dùng lisp xem sao. Theo mình lisp có thể giải quyết tốt yêu cầu của bạn...

    Vâng em đi kiếm không ra, còn tự viết thì phải đợi một thời gian nữa vì "Quá gà"

    EM block dim (không có chân) mừng hụt bác ạ. được cái này thì mất cái kia

    EM trình bày rõ mục đích các bác giúp em khác phục khó khăn này:

    em đặt số 1 vào block khung tên khi scale khung tên bao nhiêu lần thì số 1 thay đổi giá trị và kích thước theo.


  7. Ý,Bác cứ xoáy em.Việc nối lại trơn tru thì quả có khó,vì đã đi theo con đường 1 chiều r,quay lại là dễ bị tóm ngay ^^.N Chẳng phải đâu cao xa,nếu là e,cứ động đến đường nào thì e jp,jl ngay nó lại,còn những đường khác k đụng đến thì...kệ nó ^^ . Nói vui vậy chứ,nếu muốn ng ta khó chịu khi chỉnh xửa thì cũng có thể chuyển ngay file đấy thành dạng file ảnh,hoặc pdf rồi mới gửi :leluoi:,còn mình thì cứ giữ file gốc,tội j đâu nào ^^. Vote bác 1 phiếu đã,htrước e wên

    In ra bản giấy nếu chưa tin vào đối tác các bạn ạ, xem xong rồi >>> xé trước mặt cho chắc.

    Một giải pháp thô nhưng an toàn. còn không thì cứ gửi bản vẽ đầy đủ cho họ nể.


  8. MediaFire AutoCAD Drawing Shredder: AutoCAD Drawing Shredder

    Chương trình này sẽ cắt vụn các line, arc, polyline, circle trong bản vẽ ra thành nhiều mảnh. Bản vẽ vẫn in được nhưng muốn chỉnh sửa edit thì sẽ rất khó chịu :cheers:

    Sử dụng:

     

    1. Gõ lệnh App

    2. Appload file dvd ACAD Drawing Shredder vào

    3. Run Macro (Alt + F8), chọn macro tên ShredDwg

     

    VBA project mở. Bạn có thể vào chỉnh sửa theo ý thích. Hộp hội thoại tớ đề tên tớ. Nhưng các bạn thích có thể thay tên mình vào.

    Khi nào cần chương trình nối lại các line arc circle polyline thì email cho tớ. Nhưng khi đó sẽ không còn miễn phí nữa đâu :leluoi:

    Cám ơn bạn đã xây dựng diễn đàn.

    Diễn đàn này nhiều nguời tài lắm bạn ạ

    Nói vui nhé bản vẽ giấy bị cắt bạn nối đựoc không nhỉ


  9. Bạn dùng lệnh "field" trong tag Field category bạn tìm mục Object sau đó bấm vào nút chọn phía tag Object type (nút có mũi tên) Cad sẽ cho bạn chọn đối tượng; khi chọn xong Cad sẽ liệt kê 1 loạt các loại dữ liệu cho bạn chọn (bạn cứ làm thử sẽ hiểu) -> bấm Ok Cad sẽ hỏi tại dòng lệnh chiều cao chữ -> gõ H enter -> gõ 2.5. Khi bạn phóng to lên bạn regen lại sẽ có kết quả như ý.

    Cám ơn meohang

    Chưa phải bác ạ.

    em muốn có chữ số mà khi dùng lệnh SCale thì cả kích thước và giá trị sẽ thay đổi bác nhé.


  10. Nhờ các anh trên diễn đàn giúp em cách scale chữ số:

    - Số được đặt trong block ví dụ số 1 hay số 5 chiều cao chữ là 2.5

    - Scale block đó lên n lần thì chiều cao của số 1 hay số 5 to ra n lần =2.5*n

    - Số 1 hay số 5 sẽ thay đổi thành giá trị n hay 5n (nếu n=2 số 1 sẽ thành 2 hay ssó 5 sẽ thành 10)

    EM nghĩ trong lênh "field" làm được nhưng tìm không ra

    Nếu ghi số 1 hay 5 bằng Dli thì khi scale chỉ thay đổi được giá trị còn chiều cao không thay đổi, dùng lệnh sc số 1hay số 5 thì chiều cao thay đổi nhưng giá trị lại giữ nguyên.

    cám ơn mọi người

    sc_1.jpg


  11. Bạn thử lại cái này xem sao:

    ;; free lisp from cadviet.com
    
    (defun c:bao ()
    (vl-load-com)
    (setq ss (ssget))
    (if (= (tblsearch "block" "b_temp") nil)
    (command "block" "b_temp" "0,0" ss "")
    (command "block" "b_temp" "y" "0,0" ss "")
    )
    (command "-insert" "b_temp" "0,0" "" "" "")
    (setq rec (acet-ent-geomextents (setq el (entlast))))
    (setq p1 (car rec))
    (setq p2 (cadr rec))
    (setq p1 (polar p1 (+ (/ pi 4) pi) 50))
    (setq p2 (polar p2 (/ pi 4) 50))
    (setq p (polar p1 (/ pi 4) 25))
    (command "rectang" p1 p2)
    (setq el1 (entlast))
    (command "boundary" p ""
    (if (/= (getvar "cmdactive") 0)
    (alert "khong tao duoc duong bao ban hay kiem tra lai hinh ve")
    )
    )
    (command "erase" el1 "")
    (setq ss (ssget "w" p1 p2 (list (cons 0 "LWPOLYLINE"))))
    (command "change" ss "" "p" "c" "2" "")
    (setq ss (acet-ss-to-list ss))
    (setq lar (list))
    (foreach n ss
    (setq dt (dientich n))
    (setq lar (append (list (list dt n)) lar))
    )
    (setq lar (vl-sort lar '(lambda (x y)
    (> (car x) (car y))
    )
    )
    )
    (setq rm (cadr (cadr lar)))
    (Setq ss (vl-remove rm ss))
    (setq ss (acet-list-to-ss ss))
    (command "erase" ss "")
    (acet-explode el)
    )
    (defun dientich (name / are ob ll)
    (command "region" name "")
    (setq ob (vlax-ename->vla-object (setq ll (entlast))))
    (setq are (vla-get-area ob))
    (command "undo" 1)
    are
    )

    Em chưa tạo được anh Tú ạ

    http://www.cadviet.com/upfiles/3/filemau_1.dwg

    hinhmau.jpg


  12. Test trong chính cái file mà bạn gửi lên đó. Bạn chú ý là xung quanh đối tượng mà bạn chọn không có đối tượng thừa nào. bạn thử move cái hình đó ra ngoài và dùng lisp xem.

    Cảm ơn sự nhiệt tình của anh Tú. em dùng lisp trên chính file đó cũng được. em vẽ một hình khác kín hoàn toàn cũng không được.

    Em upload lại file một lần nữa nhờ các Anh giúp đỡ.

    Nội dụng: viết lisp vẽ một đường bao quanh theo viền của hình trong filemau.dwg

    http://www.cadviet.com/upfiles/3/filemau.dwg

    Cảm ơn anh


  13. Chào các pác!

    Hiện tại em đang tạo thử nghiệm những menu mới cho cty.

    Vì vậy cái này lúc xài, lúc thì không cần nên em tạo ra một cái Profile mới, khi nào mình cần thì vào Opptions-> chọn tab Profile-> chọn profile mình vừa tạo. lúc này Cad sẽ hiện những menu (.cui) và lisp di kèm với nó. Và em muốn tạo một folder riêng để chứa các menu (.cui) và các lisp. VD: ở ổ đĩa D:\newmenu

    Vấn đề là không phải máy nào cũng có cái profile em tạo này và cũng ko phải khi nào cũng dùng. Vì thế nếu vào options ở tab file chọn đường dẫn D:\newmenu thì ở mỗi máy đều phải tạo đường dẫn này (tốn thời gian), và nó nằm cố định ở đây luôn. Như vậy không hay lắm.

    Em muốn khi nào em chọn profile new thì cad tự tạo đường dẩn đến các lisp, block trong folder D:\newmenu, còn khi em chọn profile bình thường (mọi người đang dùng) thì cad chỉ tạo những đường dẫn bình thường thôi. (nghĩa là đường dẫn trong options đi theo profile mà mình chọn)

    Rất mong các pác quan tâm giúp đỡ!

    http://www.cadviet.com/forum/index.php?sho...ic=5597&hl=

    Chúc bạn thành công

    • Vote tăng 1

  14. Bạn dùng thử cái này xem có đúng ý bạn không nhé. Chú ý hình của bạn phải như bác Tue_VN đã nói ở trên.

    (defun c:bao ()
     (vl-load-com)
     (setq ss (ssget))
     (if (= (tblsearch "block" "b_temp") nil)
       (command "block" "b_temp" "0,0" ss "")
       (command "block" "b_temp" "y" "0,0" ss "")
       )
     (command "-insert" "b_temp" "0,0" "" "" "")
     (setq rec (acet-ent-geomextents (setq el (entlast))))
     (setq p1 (car rec))
     (setq p2 (cadr rec))
     (setq p1 (polar p1 (+ (/ pi 4) pi) 50))
     (setq p2 (polar p2 (/ pi 4) 50))
     (setq p (polar p1 (/ pi 4) 25))
     (command "rectang" p1 p2)
     (setq el1 (entlast))
     (command "boundary" p ""
       (if (/= (getvar "cmdactive") 0)
         (alert "khong tao duoc duong bao ban hay kiem tra lai hinh ve")
         )
       )
     (command "erase" el1 "")
     (setq ss (ssget "w" p1 p2 (list (cons 0 "LWPOLYLINE"))))
     (setq ss (acet-ss-to-list ss))
     (setq lar (list))
     (foreach n ss
       (setq dt (dientich n))
       (setq lar (append (list (list dt n)) lar))
       )
     (setq lar (vl-sort lar '(lambda (x y)
    			 (> (car x) (car y))
    		       )
    	     )
    )
     (setq rm (cadr (caddr lar)))
     (Setq ss (vl-remove rm ss))
     (setq ss (acet-list-to-ss ss))
     (command "erase" ss "")
     (acet-explode el)
     )
    (defun dientich (name / are ob ll)
     (command "region" name "")
     (setq ob (vlax-ename->vla-object (setq ll (entlast))))
     (setq are (vla-get-area ob))
     (command "undo" 1)
     are
     )

    Chào anh phamngoctukts

    Nay em mới ở quên lên

    Trước tiên em cảm ơn anh đã giúp em viết lisp này.

    Em đã test với nhiều hình khác nhau, nhưng chưa thấy tạo ra đường bao xung quanh viền (như đường mầu vàng). anh cho em xin bản vẽ mà anh đã tạo đương bao để em biết đường ứng dụng nhé

    Cảm ơn anh


  15. Chào bạn nguoithomo cùng bạn phamngoctu

    Đọc qua code của bạn Tue_NVthấy ý tưởng của bạn giống ý của Tue_NV đấy

    Tức là ý như thế này :

    1. Giả sử có 1 hình A cần vẽ đường bao

    2. Ta vẽ thêm 1 đa giác kín sao cho đa giác kín này nằm ngoài hình A cần vẽ này.

    3. Sử dụng lệnh Bo để tạo 1 đa giác kín với điểm pick nằm giữa miền tạo bởi đa giác kín với hình A

    => Như vậy đường bao ngoài hình A sẽ được xác định qua lệnh Boundary này

    4. Xoá cái đa giác kín đi.

     

    Cái đa giác kín mà bạn Tú xác định là hình chữ nhật nằm ngoài cái hình cần xác định đường bao

    Với cách xác định đa giác kín là hình chữ nhật thì trong 1 số trường hợp là không ổn vì điểm pick p rất có thể không nằm giữa miền tạo bởi hình chữ nhật và hình cần xác định đường bao mà có thể nằm giữa "miền" khác

    Để User tự vẽ và xác định mới chính xác nhất

    - Việc này sử dụng CAD, không cần sử dụng đến Lisp là chắc ăn nhất

     

    Xin lỗi vì mình đã sử dụng từ hơi khó hiểu nhưng nếu bạn đọc kĩ sẽ thấy được ý của mình

    Cảm ơn anh Tue_nv

    Cảm ơn anh phamngoctukts

    Em kon biết nên cảm tạ các bác thế nào mới phải đây ạ

    Lại một lần nữa máy tính ko cài cad, i'm sorry!

    Nhiều khi mình vẽ 3D suất sang cad 2d nhiều hình rắc rối nếu ko cần thể hiện rõ thì dùng lisp này cho đơn giản hình vẽ.

    Mình về quê vài hôm chắc rất nhớ diễn đàn

    Chúc cả nhà ngày nghỉ cuối tuần vui vẻ


  16. Nếu với bài toán trên của bạn với điều kiện là các điểm mút của các đoạn màu blue ( tạo nên đường bao màu vàng) chạm nhau tạo thành Đường kín thì việc giải bài toán sẽ đơn giản hơn(chấp nhận luôn nếu đối tượng là Block nếu nó thỏa mãn điều kiện mà Tue_NV nêu ra.

    Nhưng ở đây các điểm mút của bạn không tạo thành PLINE kín sẽ trở nên rất khó xác định đấy. :iluvyousmiley:

    Cảm ơn anh Tue_nv

    File trên là mẫu ví vụ, thường thường thì điểm nút là viền kín, còn nếu không cứ chỗ nào kín thì đường bao bám theo, đường thẳng thò ra (ví dụ đường tâm .. sẽ được bỏ qua ).

    đối tựng tạo ra là block cũng được (mầu mặc định cũng ko sao không nhất thiết phải là mầu vàng) miễn là có thế lựa chọn riêng để tách khỏi hình blue ban đầu

    em chưa biết về lisp. nếu có thể giải quyết bài toán theo cách này ko anh:

    1.tạo đường bao của các vùng kín

    2.Cộng các đường bao vừa được tạo (nếu đường bao giao nhau) để thành đường bao có diện tích lớn nhât >>> kết quả của bài toán nhưng chắc chương trình sẽ nặng

    3.nếu đường bao ko giao nhau thì để nguyên (áp dụng cho lựa chọn nhiều đối tượng cùng lúc)

    Cảm ơn anh đã giúp đỡ


  17. 1.Đồng ý với bạn, chỉ nên vẽ đúng tỉ lệ 1:1 dù có in ra các bản vẽ có tỉ lệ khác nhau.

    2.Sử dụng layout là tối ưu, một layout bạn có thể tạo ra bao nhiêu bản vẽ tuỳ ý chứ đâu nhất thiết 1 layout chỉ có 1 bản vẽ.Số bản vẽ sẽ bằng số viewport mà bạn tạo bên layout, dùng chức năng Annotation để đặt tỉ lệ bản vẽ, tỉ lệ text, dim tương ứng giúp khi in ra các dim, text vẫn bằng nhau dù cho tỉ lệ bản vẽ có khác nhau và model chỉ vẽ một tỉ lệ 1:1

    3. Cái này mình tạo ra một khung in cố định cho từng loại giấy định in ra, xref khung tên này vào layout và in theo windows

    4. Ngoài khả năng của mình :iluvyousmiley:

    Chào bạn codered8x

    Khi in hoặc cầm bản vẽ giấy thì mode và layout không khác nhau nhiều. còn khi xem bản vẽ trên cad thì mode hay hơn nếu ta sử dụng dim và khung tên hợp lý. vì zoom, pan... ko ảnh hưởng tới bản vẽ (nhìn được trực quan và tổng thể hơn) phải không các bác?

     

    4. Em nhờ các bác viết lisp hay có cách nào để số hiển thị tại vị trí của tỷ lệ bản vẽ trong khung tên thay đổi khi sc khung tên (quy về số chẵn 1,2,4,5,10 ...theo tiêu chuẩn) dù sc 1.5 hay 1.99

    Thanks

×