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

ndtnv

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

    548
  • Đã tham gia

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

  • Ngày trúng

    46

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


  1. Wow wow wow , được nhiều hồi âm giúp đỡ quá , Em cảm ơn rất nhiều

     

    *

    cài này em tạm lưu để dành sử dụng khi khác, vì kích thước của em phải theo mẩu của cty , không giống kiểu này.

     

    *

    cái này em không biết xài

    làm theo hướng dẫn nhưng nó báo thế này , A xem và chỉ giúp nhé, cài này thấy hay vì chỉ thay đổi tại 1 vị trí cố định

    Hình 1

    Hình 2

    *

    anh này đã giúp em giảm bớt được 99% thời gian làm công việc này

     

    1% là em phải vào cad nhập thêm chiều dài thanh sắt là xong

     

    Còn 1% này anh giúp được không vậy, không thì cũng rất ok rồi

    Em dùng Cad 2005, excel 2003

     

    Đó là vì chế độ security ở mức cao.

    Vào Tools->Marcro->security và chọn mức medium

    Sau đó khi mở file thì chọn enable macro là chạy được

    Nếu bạn đưa bản vẽ hoàn chỉnh, tôi sẽ giúp 100% thời gian làm công việc này

    Dĩ nhiên là phải làm chi tiết bên excel rồi


  2. Ví dụ 1:

    Khi viết lisp, các hàm lấy mã dxf của đối tượng thường dùng rất nhiều là

    ;============ Cac ham co ban ============
    ; n: dxf code
    ; Lay ma Dxf cua doi tuong
    (defun GetDxf(n elist) (cdr (assoc n elist)))
    ; Giong nhu ham GetDxf nhung neu elist khong co thi return 0
    (defun DefDxf(n elist / a) (setq a (cdr (assoc n elist))) (if a a 0))
    ; Thay doi ma Dxf cua doi tuong
    (defun ModDxf(n newval elist)
    (if (GetDxf n elist)
    	(entmod (subst (cons n  newval) (assoc n elist) elist))
    	(entmod (append elist (list (cons n  newval))))
    )
    )

    Để làm VD xin phép lấy hàm của bạn Nguyen Hoanh trong bài "Học AutoLisp, Thật là đơn giản"

    vì trong bài này bạn Nguyen Hoanh có giải thích chi tiết nên rất dễ hiểu

    http://www.cadviet.com/forum/index.code?sh...pic=80&st=0

    Ở đây tôi viết hàm TogVis để thay đổi tính ẩn hiện với tham số n là mã 60

    (defun TogVis (n / ss i elist)
    (if (= n 1)	(princ "\nSelect object(s) to hide: "))
    (if (setq i -1 ss (if (= n 1)	(ssget) (ssget "_X" '((60 . 1)))))
    	(repeat (sslength ss)
    		(setq i (1+ i)	 elist (entget (ssname ss i)))
    		(if (/= 4 (logand 4 (GetDxf 70 (entget (tblobjname "layer" (GetDxf 8 elist))))))
    			(ModDxf 60 n elist)
    		)
    	)
    	(if (= n 0)	(princ "\nNo objects was hidden. "))
    )
    (if (= n 1)	(princ))
    )

    Sau đó dùng 2 hàm sau gọi hàm TogVis

    (defun c:InVis ()	(TogVis 1))
    (defun c:Vis  ()	(TogVis 0))

    Kết quả cũng như vậy, tuy hơi khó hiểu đối với người mới bắt đầu

     

    Ví dụ 2:: Dùng bit cho tham số

    ; Ham tron toa do cua 2 point
    ;	n: if bit 1 set : x of pt1, else x of pt2
    ;	bit 2 y,	 bit 3 z
    (defun MixPoint(n pt1 pt2)
    (list (nth 0 (if (/= 0 (logand n 1)) pt1 pt2)); or car
    			(nth 1 (if (/= 0 (logand n 2)) pt1 pt2)); or cadr
    			(nth 2 (if (/= 0 (logand n 4)) pt1 pt2))); or caddr
    )

    Hàm này trộn toạ độ của 2 điểm pt1& pt2

    Tôi viết hàm TextPos sau để thay đổi vị trí text, dùng hàm MixPoint để xác định vị trí mới cho text

     

    (defun TextPos(id / pt ed l w h n)
    (setq PromptPt (list ".x" ".y" ".xy" ".z" ".xz" ".yz"))
    (setq pt (getpoint (strcat (nth (1- id) PromptPt) " of:") ))
    (setq ed (ssget '((0 . "TEXT") )) i -1)
    (repeat (sslength ed)
    	(setq i (1+ i) el (entget (ssname ed i)) n (if (= (+ (DefDxf 72 el) (DefDxf 73 el)) 0) 10 11))
    	(ModDxf n (MixPoint id pt (GetDxf n el))  el)
    )
    (princ)
    )

    Như vậy muốn thay đổi x ta chỉ cần gọi (TextPos 1), đổi y ta chỉ cần gọi (TextPos 2)....

    ;============ Thay doi vi tri text ============
    (defun C:TextX() (TextPos 1))
    (defun C:TextY() (TextPos 2))
    (defun C:TextZ() (TextPos 4))
    (defun C:TextXY() (TextPos 3))
    (defun C:TextXZ() (TextPos 5))
    (defun C:TextYZ() (TextPos 6))

     

    Ví dụ 2: Ta còn có thể thay đổi tham số để gọi các lệnh khác nhau

    Ở đây tôi viết hàm để trim hay extend nhiều đối tượng,

    Trong các version mới của cad đã có hàm này nhưng ai còn dùng cad cũ thì các hàm sau vẫn còn có ích

    Code của hàm này tôi cũng lấy từ diễn đàn về viết lại

    (defun MulAdjust (id / n i e ss pt cm ms ce em)
    (setq cm (list "Trim" "Extend" "Adjust"))
    (setq ce (getvar "CMDECHO") em (getvar "EDGEMODE") ms (nth (1- id) cm))
    (setvar "CMDECHO" 0) (setvar "EDGEMODE" 0)
    (princ "Select edges :")
    (setq e (ssget))
    (princ (strcat "Select objects to " ms " :"))
    (setq ss (ssget) n 0)
    (setq pt (getpoint (strcat "side to " ms)))
    (repeat 2
    	(if (/= 0 (logand id (lsh 1 n)))
    		(progn
    			(setq i -1)
    			(command (nth n cm) e "")
    			(repeat (sslength ss) (setq i (1+ i))(command (list(ssname ss i) pt)) )
    			(command "")
    		)
    	)
    	(setq n 1)
    )
    (setvar "CMDECHO" ce) (setvar "EDGEMODE" em) (princ) 
    )

    Trong đó bit 1 của id nếu set thì sẽ dùng lệnh "TRIM" , bit 2 là "Extend"

    Thay đổi id ta có được 3 hàm để "Trim", "Extend" hoặc đồng thời cả 2

    (defun C:ExTrim () (MulAdjust 1))
    (defun C:ExExtend () (MulAdjust 2))
    (defun C:ExAdjust () (MulAdjust 3))

    • Vote tăng 2

  3. Tôi xin đóng góp 1 vài VD về dùng chương trình con

    Khi viết lisp, có nhiều đoạn code gần như lặp lại, vì vậy nếu dùng chương trình con sẽ giúp rút ngắn code khá nhiều.

    Việc rút ngắn code không có nghiã là chương trình chạy mau hơn, nhưng nó giúp cho 1 hàm ngắn hơn, dễ xem hơn

    và tìm lỗi cũng dễ dàng hơn.

    Chú ý :

    -Trong chương trình con, chỉ nên dùng biến cục bộ,

    -Các chương trình con thường dùng nên ghi chú kỹ và cho vào 1 file riêng để khi dùng dễ đối chiếu

    http://www.cadviet.com/upfiles/Example.rar

    • Vote tăng 2

  4. Do cong tong hop o day co nghia la: (15° + 5°)/2= khong phai la 10° ma la 11°. neu cac ban giai 1 bai toan hinh hoc khong gian thi se thay giai dap gan giong nhu Toi dua ra.

    Bạn phải nói rõ hơn yêu cầu thì mới làm được

    VD: A có tọa độ (0,0,0) B(12,0,1). Điểm nằm giữa cung AB là C(6,0.2553, z)

    Hay là AB có độ cong trên XY là R=12m. còn độ cong trên XZ là bao nhiêu


  5. Tôi cũng đang định viết hàm để lấy text trong bảng từ Acad sang Excel nhưng có các vấn đề sau:

    - Không rõ VBA có hay không các hàm Quick sort để lọc các text, sắp xếp theo hàng và cột thì mới xuất ra đúng được.

    - Nếu vị trí text lệch 1 ít thì sẽ cho kết quả sai khác nhiều

    Vì vậy nếu text nằm trong bảng thì có lẽ nên chọn các đường thẳng ngang và đứng, sau đó chọn text trong từng ô rồi mới export.

    Nếu ai đã viết các hàm tiện ích, xin đóng góp thêm


  6. Lệnh cutdim trên cắt dim nhưng chỉ ra kết quả 2 đường ext line bằng nhau

    Sau đây là lệnh trim dim dùng line

    Lệnh trimdim chọn đường thẳng, sau đó chọn các dim

    Trong phạm vi line

    -Các ext line dim cắt qua line sẽ bị trim

    -Các ext line dim chưa tới sẽ extend tới line

    Dĩ nhiên là lệnh trên chỉ tác dụng với các dim linear và dim rotate vì các loại dim còn lại

    sẽ ra kết quả không đúng

    Link:

    http://www.cadviet.com/upfiles/TrimDim.lsp


  7. Dùng safearray trong LISP tiện lợi hơn nhiều so với dùng list

    VD khi viết bảng TKCT, nếu dùng biến thường thì mỗi loại thép phải đặt cho 1 tên.

    Như vậy, ta khó dùng các vòng lặp để gán và lấy biến. Nếu dùng list thì việc gán trị rất phức tạp.

    Giải pháp là dùng safearray .

    Sau đây là hướng dẫn dùng safearray dịch từ help của acad

    Creates a safearray

    (vlax-make-safearray type '(l-bound . u-bound) ['(lbound . u-bound)...)]

    1 array có thể có tối đa 16 chiều. Các biến trong array được khởi tạo như sau :

    Numbers

    0

    Strings

    Zero-length string.

    Booleans

    :vlax-false

    Object

    nil

    Variant

    Uninitialized (vlax-vbEmpty)

    Arguments

    type

    Kiểu của safearray được định theo các hằng số sau:

    vlax-vbInteger (2) Integer

    vlax-vbLong (3) Long integer

    vlax-vbSingle (4) Single-precision floating-point number

    vlax-vbDouble (5) Double-precision floating-point number

    vlax-vbString (8) String

    vlax-vbObject (9) Object

    vlax-vbBoolean (11) Boolean

    vlax-vbVariant (12) Variant

    Số nguyên trong ngoặc là giá trị các hằng số. Bạn nên dùng các hằng số thay cho các số nguyên vì có thể thay đổi trong các phiên bản khác của AutoCAD.

    '(l-bound . ubound)

    Chỉ số dưới và trên của 1 chiều.

    Return Values

    The safearray created.

    Examples

    Tạo safearray 1 chiều l oại double bắt đầu từ chỉ số 0:

    _$ (setq point (vlax-make-safearray vlax-vbDouble '(0 . 3)))

    #<safearray...>

    Dùng hàm vlax-safearray->list để thể hiện nội dung của safearray như 1 list:

    _$ (vlax-safearray->list point)

    (0.0 0.0 0.0 0.0)

    Kết quả cho thấy mỗi phần tử trong array được khởi tạo là zero.

    Tạo safearray 2 chiều l oại string bắt đầu từ chỉ số 1:

    _$ (setq matrix (vlax-make-safearray vlax-vbString '(1 . 2) '(1 . 2) ))

    #<safearray...>

    • Vote tăng 3
×