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. Đâ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


  2. 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ự.

    https://www.mathopenref.com/coordpolygonarea2.html


  3. 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))    )
    )
    
    
    • Like 1

  4. 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

    http://1400.vn/tin-tuc

    • Vote tăng 1

  5. 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:"))))
    
    ....
    
    
    • Vote tăng 1

  6. 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

    • Vote tăng 1

  7. 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&amp;pid=215732&amp;st=260&amp;#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

    • Like 1

  8. 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")))

     

    • Like 2

  9. 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

     

    • Like 1

  10. 
    (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

    BOUNDARY.dwg

×