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. Lisp này tôi load trên cadviet (gg nhưng không tìm thấy, hình như của ad nguyen hoanh ) và có chỉnh sửa.

    Vì dùng lệnh trim của cad nên có thể chọn nhiều loại đối tượng và đường cắt.

    Chú ý biến EDGEMODE và điểm pick để có kết quả mong muốn

    
    (defun c:MulTrim ( / ls p)
        (prompt "\nChon cac doi tuong bi cat :")
        (setq ls (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget)))) p (getpoint "\nPick phia cat :"))
        (prompt "\nChon duong cat :")
        (vl-cmdf "Trim" (ssget) "")
        (foreach e ls
            (vl-cmdf (list e p))  )
        (vl-cmdf "")
    )
    
    

  2. 13 giờ trước, NVH_CADVIET đã nói:

    Dear Nguyen Hoanh

    biết lệnh adcenter

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    Mình có 1 file fas: THEMTEXT (ADDT).01.fas (Chắc file đã mã hóa của tác giả mình không rõ nữa) mình chép vào trong thư mục của mình  : c:/THUC HANH-BT1/THEMTEXT (ADDT).01/THEMTEXT (ADDT).01.fas

    Theo code của bác mình làm thử :

     + chỉ cần load file lisp theo code dưới đây mà nó vẫn load được file .fas này. và đọc được lệnh (ở đây là lệnh ADDT của file .fas) mà không cần phải load file : THEMTEXT (ADDT).01.fas này

    + Vấn đề ở đây là nó không thực thi 5 lần sử dụng. (nó vẫn chạy bình thường theo file fas. ấy (tuy không phải load. Vì nó tự load theo đường dẫn.

    Vây không biết sai sai gì đó. Nhờ bác góp ý nhé. 

     

     

    (load "c:/THUC HANH-BT1/THEMTEXT (ADDT).01/THEMTEXT (ADDT).01.fas")
    (defun c:TEST ()
      (C: ADDT)
    ;;; Doc gia tri
    (setq tmp (getcfg "c:/THUC HANH-BT1/THEMTEXT (ADDT).01/THEMTEXT (ADDT).01.fas")
    sl (cond
    ((or (not tmp) (= tmp "")) "5")
    (t tmp)
    )
    )

    ;;; Kiem tra va thong bao
    (if (/= sl "0")
    (progn
    ;;; Thuc thi ma lenh
    (princ (strcat "\nBan con " sl " lan su dung nua"))
    ;;; Luu gia tri
    (setcfg "c:/THUC HANH-BT1/THEMTEXT (ADDT).01/THEMTEXT (ADDT).01.fas" (itoa (1- (atoi sl))))
    )
    (princ "\nBan da het han su dung!")
    )

    (princ)
    )

     

    => LÀM THỰC HÀNH THÔI ! "ĐANG CỐ HIỂU.. NHƯNG CÀNG CỐ ... CÀNG KHÔNG HIỂU" . 

    Xin cảm ơn!

     

    Bạn xem lại code của Nguyen Hoanh

    Code của bạn:

    (defun c:TEST ()
      (C: ADDT)

    ...

    Dòng (C: ADDT) đặt ở vị trí này thì luôn thực thi là phải rồi

    Phải đặt ở chỗ

    ;;; Thuc thi ma lenh


  3. 33 phút trước, Doan Van Ha đã nói:

    Cho hỏi tí:

    1. Tại sao viết '''((u v) thì tương đương với '(lambda(u v)   ?
    2. Cách viết 1 ngoài ngắn gọn thì có gì ưu điểm so với cách viết dùng lambda? Và liệu lambda có phải là hàm thừa?

    Cách viết '''((u v) tôi copy của 1 member trên cadviet từ lâu rồi, vì ngắn hơn nên dùng thôi, cũng như '(1 2) ngắn hơn (list 1 2) vậy

     

    • Vote tăng 1

  4. Vì không có bản vẽ nên bạn tự đặt thuộc tính các đoạn thẳng cần vẽ

    
    (defun C:TOP ( / l p q)
        (foreach e (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget '((0 . "LINE"))))))
            (setq p (cdr (assoc 10 (entget e))) q (cdr (assoc 11 (entget e))))
            (setq l (cons (if (> (cadr p) (cadr q)) p q) l))
        )
        (setq l (vl-sort l ''((u v) (< (car u) (car v)))))
        (mapcar ''((u v) (entmakex (list '(0 . "LINE") (cons 10 u) (cons 11 v)))) l (cdr l))
    )
    
    
    • Vote tăng 2

  5. Code lấy tập hợp điểm bên phải ss1 và sắp xếp từ trên xuống:

    (repeat (sslength ss1)
        (setq e (vlax-ename->vla-object (ssname ss1 giaso)))
        (setq pd (vlax-curve-getStartPoint e))
        (setq pc (vlax-curve-getEndPoint e))
        (setq p (if (< (car pd) (car pc)) pc pd))
        (setq list1 (cons p list1))
        (setq giaso (1+ giaso))
    )
    (setq list1 (vl-sort list1(function (lambda (x1 x2)(> (cadr x1) (cadr x2)) ) ) ))

    Bạn tự viết cho ss2 rồi nối lại

    • Like 1

  6. 1. Ngoài khả năng của tôi vì tôi đã tìm hiểu cách tìm phương trình Spline nhưng có nhiều cách khác nhau thường là mô phỏng theo hàm mũ.

         y = Σai.x^i  Chỗ này có nói cách tìm hệ số ai

      Tôi thấy cách tính ở đây hợp lý hơn nhưng không có hướng dẫn cách tìm các hệ số:

         x = Σai.t^i

         y = Σbi.t^i

    2 . Sai số của số thực khoảng 5e-16 nên theo tôi khi copy ra thì do

    (vlax-curve-getFirstDeriv ent (vlax-curve-getParamAtPoint ent pt) xấp xỉ sai số đó

    => các control point thay đổi với giá trị tuyệt đối gần như nhau nhưng tương đối sẽ khác nhau

    => góc khác nhau

    3. Vì độ chính xác số thực của máy tính như vậy nên một số trường hợp đặt biệt như bài này không làm được

    • Like 1

  7. debug thấy

    (vlax-curve-getFirstDeriv ent (vlax-curve-getParamAtPoint ent pt)) = (1.26979e-016 9.16744e-015 0.0)

    gần đạt đến giới hạn độ chính xác của số thực => góc có sai số lớn

    thêm đoạn code sau:

        (setq g (entget ent) lp (vl-remove-if-not ''((x) (=(car x) 10)) g))

    ta được

    lp = ((10 3568.58 447.895 0.0) (10 3579.31 450.769 0.0) (10 3599.03 456.054 0.0) (10 3606.68 492.683 0.0) (10 3640.52 520.304 0.0) (10 3825.43 440.735 0.0) (10 3825.43 440.735 0.0) (10 3825.43 440.735 0.0))

    3 điểm control cuối gần = nhau. Tăng độ chính xác
        (setq d56 (mapcar '- (cdr (nth 6 lp)) (cdr (nth 5 lp))) d67 (mapcar '- (cdr (nth 7 lp)) (cdr (nth 6 lp))))

    d56 = (0.0 0.0 0.0), d67 = (0.0 4.54747e-013 0.0)

    ta thấy điểm 5 và 6 trùng nhau, điểm 7 cách không đáng kể

    Không thể bắt nearest vào đoạn gần cuối

     

    • Like 1

  8. Vào lúc 29/7/2021 tại 09:53, Nguyen hai 289 đã nói:

    Hi anh chị, anh chị cho em hỏi chút, có cách nào mà text trong block không bị đảo lộn khi dùng lệnh đối xứng MI block đó không ạ ?

    Em cảm ơn anh chị ạ.!

    Dùng Attribute thay cho text

    https://knowledge.autodesk.com/support/autocad/troubleshooting/caas/sfdcarticles/sfdcarticles/Preventing-text-in-blocks-from-being-mirrored-with-block.html


  9. Khi chiều xoay p1,p2,p3 là CW nhưng p11,p21,p31 là CCW hoặc ngược lại

    thì ss2 align 3D nên DXF 210 /= (0 0 1) => Lỗi text

    Giải pháp:

    Cách 1. Đổi DXF 210 về (0 0 1)

    Cách 2. Nên làm mặc dù phức tạp hơn:

    Bỏ p3, p31 và thay bằng "" trong lệnh ALIGN

    Sau đó hỏi MIRROR ss2 Y/N ? hoặc Y/N/Undo ?

    Nếu Y thì MIRROR ss2 qua line qua p11 và vuông góc p11, p21

    • Like 1

  10. Ví dụ 2 dòng sau đều gán a = 2

    (setq a 2)
    (set 'a 2)

    Tuy nhiên hàm set chậm hơn nhưng cho phép by reference, hàm setq chỉ cho phép by value

    VD hàm swap 2 biến :

    (defun Swap (ru rv / w) (setq w (eval ru)) (set ru (eval rv)) (set rv w))

        (setq a 1 b 2)
        (swap 'a 'b)

    • Like 2
×