-
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
-
-
Thử cài autocad dwg trueview
Sau đó sửa trong registry theo hướng dẫn:

-
Trang LeeMac chỉ có hàm cho tam giác.
Vì bạn chỉ hỏi thuật toán nên tôi chỉ đưa link
Tôi test theo trang này và kết quả OK.
http://dominoc925.blogspot.com/2012/03/c-code-to-determine-if-polygon-vertices.html
Một số trang khác có công thức hơi khác nhưng cũng có kết quả tương tự.
-
Thay dòng đầu thành
(setq s (strcat (getvar "DWGPREFIX") (vl-string-subst "txt" "dwg" (strcase (getvar "DWGNAME")T))))
-
1
-
-
Chắc bạn bấm nút để download lisp, cách này hay bị lỗi.
Hãy copy code, past vào file text rồi save thành file .lsp
code mới có vẽ khung
(defun eText (p h s u v) (entmake (list '(0 . "TEXT") (cons 10 p)(cons 11 p) (cons 1 s) (cons 40 h)(cons 72 u)(cons 73 v)))) (defun ekLine (p q) (entmake (list '(0 . "LINE") (cons 10 p) (cons 11 q)))) (defun C:IPT( / file h i line n p r s title x x0 xn y y0) (setq s (getfiled "\nFile text:" "" "txt" 0)) (setq h 2.2 ; cao text r 5 ; kc hang n '(3 2 5 6) x '(0 25 50 80 100); title '("JOINT NO." "SIZE" "DIA INCH." "QUANTITY.")) (setq file (open s "r") p (getpoint "\nVi tri: ")) (setq x0 (car p) y0 (cadr p) y (- y0 6)i 0 xn (+ x0 (last x))) (repeat 4 (eText (list (+ x0 (* 0.5 (+ (nth i x) (nth (1+ i) x)))) y) h (nth i title) 1 1) (setq i (1+ i)) ) (ekLine p (mapcar '+ p (list (last x) 0 ))) (setq y (- y 2)) (ekLine (list x0 y) (list xn y)) (while (setq s (read-line file)) (setq line (read (strcat "(" s ")"))) (if (>= (length line) 6) (progn (setq i 0 y (- y r)) (repeat 4 (eText (list (+ x0 -10 (nth (1+ i) x)) y) h (itoa(nth (nth i n) line)) 2 1) (setq i (1+ i)) ) ) ) ) (close file) (setq y (- y 2)) (ekLine (list x0 y) (list xn y)) (foreach e x (ekLine (list (+ e x0) y0) (list (+ e x0) y)) ) )-
1
-
-
Vì không gửi file cad nên tôi chỉ viết phần xuất text, phần kẻ khung bạn tự làm.
Tên lệnh và các thông số chiều cao text, kc hàng. .. bạn tự sửa trong lisp cho phù hợp.
(defun eText (p h s u v) (entmake (list '(0 . "TEXT") (cons 10 p)(cons 11 p) (cons 1 s) (cons 40 h)(cons 72 u)(cons 73 v)))) (defun C:IPT( / file h i line n p r s x y) (setq s (getfiled "\nFile text:" "" "txt" 0)) (setq h 3 ; cao text r 5 ; kc hang n '(3 2 5 6) x '(20 40 60 80 )) ; vi tri (setq file (open s "r") p (getpoint "\nVi tri: ") y (cadr p)) (while (setq s (read-line file)) (setq line (read (strcat "(" s ")"))) (if (>= (length line) 7) (progn (setq i 0 y (- y r)) (repeat 4 (eText (list (+ (car p) (nth i x)) y) h (itoa(nth (nth i n) line)) 2 1) (setq i (1+ i)) ) ) ) ) (close file) )Uống cafe thì mất time di chuyển, thay vào đó, nếu thấy lisp có giá trị, bạn nhắn tin từ thiện rồi chụp ảnh post lên
-
1
-
-
Khi bấm "accept" chỉ lấy P, Q, K, S, L, N mà không thực hiện 2 dòng lisp sau
(setq num (atoi (get_tile "dim3")))
(setq D (atoi (nth num DDim3)))thì làm sao lấy đúng D được
-
1
-
-
Đoán là 790312 ngành đo đạc bản đồ và cần xuất điểm hàng loạt.
Nếu đúng thì tìm lisp xuất điểm hàng loạt từ file text hoặc excel ra cad
-
Chỉnh sửa mã Lisp
trong AutoLisp
Xem lại các dòng lệnh
(command ".Extrude" ss1 "" H "")
=>
(command ".Extrude" ss1 "" H )
(setq ss4 (ssget))
(setq ss5 (ssget))
=>
(setq ss4 (ssget) "L")
(setq ss5 (ssget) "L")
Học debug sẽ dễ biết lỗi ở dòng nào
-
Lisp của bạn hết hạn vào ngày 24/10/2018
Tôi đã hướng dẫn trong
-
assoc còn dùng để liên kết với hàm. Tham khảo:
(setq path "D:/Block" full_list (mapcar '(lambda (x) (cons (strcase (vl-filename-base x)) (strcat path "/" x))) (vl-directory-files path "*dwg" 1))) (setq full_list (append full_list (mapcar 'cons '("CAO-DO-(DCD)" "MAT-CAT-(MC)" "DUONG-KINH-THEP-(DDD)" "SECTION-(SE)") (list C:DCD C:MC C:DDD C:SE)))) (or #KYHIEU-Name (setq #KYHIEU-Name "CENTER")) (initget "CAO-DO-(DCD) MAT-CAT-(MC) DUONG-KINH-THEP-(DDD) SECTION-(SE) CENTER LY-TRINH HUONG-TUYEN COC-KN GRASS SEC-NOTE") (setq #KYHIEU-Name (cond ((getkword (strcat "\nCh\U+1ECDn ky hi\U+1EC7u Block : [CAO-DO-(DCD)/MAT-CAT-(MC)/DUONG-KINH-THEP-(DDD)/SECTION-(SE)/CENTER/LY-TRINH/HUONG-TUYEN/COC-KN/GRASS/SEC-NOTE] <"#KYHIEU-Name">")))(#KYHIEU-Name))) (if (setq as (assoc #KYHIEU-Name full_list)) (setq nameblock (cdr as))) (if (not nameblock) ; truong hop "COC-KN" "SEC-NOTE" ; code cua quocmanh04tt ); end if (if (= (type nameblock) 'SUBR) (nameblock) (progn (setq scale (getvar "dimscale") pt1 (getpoint "\nPick a point:")))) ....-
1
-
-
Giả sử ban đầu biến list lưu các biến a1, a2, b1, b2, c1, c2....
Đến lúc nào đó cần thêm biến a3 thì khi đọc list trên sẽ không còn đúng nữa
Trong trường hợp này dùng assoc dễ quản lý hơn nhiều
-
23 giờ trước, Danh Cong đã nói:Các bác cho em hỏi:
Giả sử có danh sách các tên biến: A , B , C , D , E , F ...vv...
Làm cách nào để gán giá trị của nó nhanh nhất với 1 list danh sách : List-Giatri (1 2 3 4 5 ...vv...)
Tức là theo cách thủ công có thể làm:
(setq A (nth 0 List-Giatri )
(setq B (nth 1 List-Giatri )...
Nếu giả sử có vài chục biến thì tốn công gõ quá. Vậy trường hợp này sử lý với Mapcar và Lambda ra sao?
Mong các bác góp ý :))))))
Lập trình gì mà phải dùng đến vài chục biến có giá trị liên kết với 1 list, sao không dùng trực tiếp list.
Lấy giá trị List đơn giản, thay đổi giá trị List hơi phức tạp và chậm nếu list lớn nhưng dùng đến vài chục biến là không ổn
Nếu cần phải thay đổi giá trị nhiều thì dùng vlax-safearray hoặc assoc là được
-
1
-
-
Đánh lệnh UCSFOLLOW = 0
-
1
-
-
17 giờ trước, Doan Van Ha đã nói:Cái này làm trên Cad chắc chỉ gần đúng thôi. Lisp này tôi viết 6 năm rồi.
Bạn vẽ 1 Line song song trục Y rồi làm theo lisp (do lisp cũ không để ý xline như bạn)
http://www.cadviet.com/forum/index.php?showtopic=53705&pid=215732&st=260&#entry215732
Bạn Doan Van Ha quên cách nhanh và chính xác của chính bạn:
Copy ellipse theo phương ngang, vẽ XLINE với osnap là tangent với 2 ellipse
-
1
-
-
Đánh lệnh UCS - ob, pick vào đường chéo, viết text xong đánh lệnh UCS -W
Hoặc dùng 2 lệnh lisp sau
(defun C:UO () (command "._UCS" "_ob"))
(defun C:UW () (command "._UCS" "UCS" "World")) -
2 giờ trước, Học Sinh Lớp 1 đã nói:Hóa ra là thế :( cảm ơn bác nha. Tiện thể nếu bác có hứng thú thì bác giải thích cho e cách dùng hàm lambda được không ạ.
VD
(length(vl-remove-if '(lambda (x)(/= x "A"))(list "A" "B" "C" "D" "A" "C" "D" "B" "A" "C")))
viết rút gọn:(length(vl-remove-if ''((x)(/= x "A"))'("A" "B" "C" "D" "A" "C" "D" "B" "A" "C")))
hoặc
(length(vl-remove-if-not ''((x)(= x "A"))(list "A" "B" "C" "D" "A" "C" "D" "B" "A" "C")))
-
2
-
-
Muốn kết quả là PLINE
(defun C:TestRegion (/ s r o i k ssa t0) (setq s (vlax-ename->vla-object(car (entsel)))) (setq r (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget '((0 . "REGION")(8 . "LUOI")))))))) (setq t0 (getvar "MilliSecs")) (foreach e r (setq o (vla-copy s)) (vla-boolean e acIntersection o) (if (> (vla-get-Area e) 0) (progn (setq i (vlax-vla-object->ename e)) (vl-cmdf "._EXPLODE" i "") (if (setq ss (ssget "P" '((0 . "REGION")))) (progn (setq k 0) (repeat (sslength ss) (vl-cmdf "._EXPLODE" (ssname ss k) "" "") (vl-cmdf "._PEDIT" "M" "P" "" "J" "" "" ) (setq k (1+ k)) ) ) (vl-cmdf "._PEDIT" "M" "P" "" "J" "" "" ) ) ) ) ) (-(getvar "MilliSecs") t0) )Chạy bài 540 REGION mất 10s
Nếu vẫn muốn kq là REGION :
ss <> nil : không thực hiện các lệnh trong if
ss = nil: undo bước (vl-cmdf "._EXPLODE" i "")
P/s: Biến PEDITACCEPT = 1
-
1
-
-
(defun C:TestRegion (/ s r o i t0) (setq s (vlax-ename->vla-object(car (entsel)))) (setq r (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget '((0 . "REGION")(8 . "LUOI")))))))) (setq t0 (getvar "MilliSecs")) (foreach e r (setq o (vla-copy s)) (setq i (vla-boolean e acIntersection o)) ) (-(getvar "MilliSecs") t0) )
Test với bản vẽ có ô lưới = 1/10 của bv bạn đưa lên, có 540 region mất khoảng 1.5s
Nếu dùng select các ô có giao với region gốc time còn giảm
Trường hợp region có nhiều vùng, dùng lisp region=>pline, rồi region lại có lẽ lâu hơn 1 chút
-
dxf trả kq ở world, dùng trans nên vẽ sai nếu UCS không phải world
-
Copy ra chỗ khác, explode các ACAD_PROXY.
Dùng các lisp nội suy (có nhiều trên cadviet) .
Copy kết quả về.
Bằng cách này có thể viết lisp nội suy cho hàng loạt các mắt lưới.
-
-
Thêm
(setvar "OSMODE" 0)
vào trước
(if
((and (> L-Room 0) (> W-Room 0))rồi khôi phục "OSMODE" vào cuối chương trình
Chương trình viết quá dài dòng
Dồn if and thành 1 cho gọn
Chỉ cần tách riêng (command " ".Array" ..)
hàm abs không cần vì max >= min
(/ L-Room (* 2 CO)) => (/ L-Room 2 CO)
-
Biến j chưa tính nên có giá trị default=0 gây lỗi
Nếu sửa
If Emin < E0 And E0 < Emax Then
j = 2
Do While Bang_Tra.Cells(j, 1).Value < E0
j = j + 1
Loop
End If(đổi i => j)
thì ra kết quả nhưng không biết đúng ý đồ không?
-
Kiểm tra giá trị biến A, B, C trong hàm thì được, còn tại ô exel đó thì ý là ntn?
Đưa project lên rồi giải thích rõ
Hay ý Danh muốn biết giá trị ô excel
Range("A1")
Range("A1").Value
Range("A1").Formular
....
-
1
-
Hỏi về tạo kiểu Dim
trong Sử dụng AutoCAD
Đã đăng · Trả lời báo cáo
Đây là loại hình chiếu trục đo vuông (xiên) góc đều hay còn gọi hình 2.5D
Dim dài chỉ đo đúng theo 3 phương. Không đo được dim góc
Trong bản vẽ mẫu chỉ có 2 loại dim ngang và đứng, không có dim theo chiều sâu.
Nếu vẽ ít thì copy loại dim tương ứng rồi kéo chân dim vào vị trí.
Nếu muốn nhanh mà vẽ nhiều thì dùng lisp để chuyển thành loại dim phù hợp
Muốn có lisp nhanh thì y/c lisp có phí, còn không thì chờ vì bây giờ gần tết nên ít ai rãnh viết free