-
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
-
-
Đây là đường link tới trang upload của diễn đàn, đâu phải đường link tới bản vẽ upload của bạn.
Nếu bạn chưa biết cách, gửi mail cho tôi ndtnve@yahoo.com, tôi upload giúp cho
-
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
*
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
-
-
Khi dùng hàm getcorner,acad tự động vẽ 1 rubber-band box, nhưng luôn nằm ngang.
Bạn nào biết cách để vẽ rubber-band box nằm theo phương bất kỳ không
-
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))
-
2
-
-
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
-
2
-
-
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
-
Cho mình đăng ký 1 vé
-
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
-
lisp trimdim
trong AutoLisp
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:
-
Để gán trị dùng các hàm
vlax-safearray-fill
vlax-safearray-put-element
Để lấy trị dùng
vlax-safearray-get-element
1 số hàm khác
vlax-safearray-get-dim
vlax-safearray-get-l-bound
vlax-safearray-get-ul-bound
Cách dùng xem help
-
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...>
-
3
-
-
File có 2 sheet
Sheet layer: tạo linetype và layer cho bản vẽ acad đang active
Sheet table: xuất bảng từ Excel ra acad
Phải mở acad trước khi bấm nút xuất
Link
-
7
-
Vẽ lệnh Pline với 2 do công trên một điểm
trong Lập trình khác
Đã đăng · Trả lời báo cáo
Đây là link tôi upload cho bạn hasihai
http://www.cadviet.com/upfiles/CADVIET_02.rar