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

thiep

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

    514
  • Đã tham gia

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

  • Ngày trúng

    48

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


  1. @ngokiet

    Thiệp chỉ nói là "thông thường" thôi, chứ trong không gian, thì xét cả thành phần z của vecto nữa:

    (setq v (mapcar '- Pt1 Pt2)
              w (mapcar '- Pt3 Pt2)
        )
        (setq bit (or (and (equal (- (* (car v) (cadr w)) (* (cadr v) (car w))) 0.0 1e-6)
                 (equal (- (* (car v) (caddr w)) (* (caddr v) (car w))) 0.0 1e-6)
            	)
            	(and (equal (- (* (car v) (cadr w)) (* (cadr v) (car w))) 0.0 1e-6)
                 	(equal (- (* (cadr v) (caddr w)) (* (caddr v) (cadr w))) 0.0 1e-6)
            	)
            	(and (equal (- (* (car v) (caddr w)) (* (caddr v) (car w))) 0.0 1e-6)
                 	(equal (- (* (cadr v) (caddr w)) (* (caddr v) (cadr w))) 0.0 1e-6)
            	)
        		)
        )
    (cond ((= bit t)(princ "\np1 p2 p3 collinear"))
          ((= bit nil)(princ "\np1 p2 p3 isn't collinear"))
    )

     


  2. 4 phút trước, ngokiet đã nói:

    Bác xem lại vector là gì đi. 2 vector đó là chiều dài khác nhau. Nếu xét về chỉ hướng mới giống nhau thôi.

    Ý tôi muốn nói 2 vecto pháp tuyến có cùng hướng, thì dù có dài ngắn khác nhau, điểm định vị trí đầu vecto không trùng nhau đi nữa, thì nó cũng chỉ là 1 vecto pháp tuyến thôi.


  3. 2 phút trước, ngokiet đã nói:

    @thiep Mình lần đầu tiên mình nghe nói 1 mặt phảng chỉ có duy nhất 1 vector pháp tuyến. Mình mới kt lại google thì đại đa số nói là 1 mở có vô số vector pháp tuyên và vector bác đua chỉ là 1 trong đó mà thôi.

    Còn 1 mặt phẳng có thể có nhiều phương trình nhưng 1 phương trình thì chỉ có 1 mặt phẳng. Đôi khi A là B nhưng B không là A.

    Còn mình viết tự định quy tắc ko giống ai. là trong lập trình riêng của mình thôi. Còn trả lời trên này mình vẫn rất quy củ đấy. Cho nên bác ko nên trích 1 phần câu ra để soi mói như vậy.

    Nên hiểu là các vecto có cùng hướng cũng chỉ là 1 vecto thôi bạn. ví dụ vecto pháp tuyến '(1 1 2) và '(2 2 4) cũng chỉ là 1 thôi.


  4. ;; Collinearity check (Lee Mac)

    (defun isCollinear ( p1 p2 p3 fz ) (equal (rem (angle p1 p2) pi) (rem (angle p2 p3) pi) fz) )

    49 phút trước, ngokiet đã nói:

    @gia_bach ....Ví dụ như lisp bác xét 3 diểm thẵng hàng bắng lệnh angle thì lệnh angle chỉ tính được góc chiếu bằng thôi. Cho nên cần cẩn thận khi viết lisp 3d.

    Thông thường, để xét 3 điểm có thẳng hàng không, Thiệp dùng đoạn mã này:

    (setq v  (mapcar '- P1 P2)
            w    (mapcar '- P3 P2)  

    )

    (if (equal (- (* (car v) (cadr w)) (* (cadr v) (car w)) 0 1e-6)

    (princ "3 point p1 p2 p3 is collinear)

    (princ "3 point p1 p2 p3 isn't collinear))

    • Like 1

  5. 2 giờ trước, ngokiet đã nói:

    Vậy có điều kiện ABCD như thế nào không? Ví dụ như 0x+0y+1z -5=0 với 0x+0y-1z+5=0 là 1 mặt phẳng. Nhưng khi lấy ABC là 0 0 1 và 0 0 -1 là 2 vecto đối nhau.

    vì vây khi tính tích có hướng thì làm sao xác định nó là pháp vecto hay là Vectơ đối?

    Lập trình mình quên quy tắc toán nhiều nên đôi khi tự định quy tắc ko giống ai.

     

    @ngokietXin nói lại: với mỗi 1 mặt phẳng có phương trình Ax + By + Cz + D = 0 thì chỉ có 1 vecto pháp tuyến '(A B C)

    Theo ví dụ của @ngokiet tuy cùng 1 mặt phẳng Z=5 nhưng có 2 phương trình khác nhau thể hiện, nên sẽ có 2 vecto pháp tuyến khác nhau

    Phương trình 0x+0y+1z -5=0 nhận '(0 0 1) làm vecto pháp tuyến; Phương trình 0x+0y-1z+5=0 nhận '(0 0 -1) làm vecto pháp tuyến

    Điều này nó giống như mặt phẳng (Z=5) có phương trình 0x+0y+1z -5=0 được lật ngược lại 180 độ thì có phương trình 0x+0y-1z+5=0.

    Đó là quy tắc chứ không phải tự định quy tắc ko giống ai.

    @giabach xem ra quy tắc bàn tay phải áp dụng cho các trục hệ toạ độ vuông góc, đã hơn 35 năm rồi Thiệp vẫn còn nhớ. Hề hề.

     

    image.png.821177185558359937fdd7040118c81f.png


  6. 1 giờ} trướ}c, ngokiet đã nói:

    Mình nghĩ AutoCAD có tính toán lại. Vì 1 mặt phẳng có 2 pháp vector ngược nhau. Nên khi entmake nó phải tính lại hướng. Ví dụ như ‘(0 0 1) và ‘(0 0 -1) thì nó tính như nhau. Nên tính đúng assoc 210 phải kiểm tra thêm. Nên cho Cad tính luôn. Mình ko biết Cad khác có vậy ko. Nếu có xem có lỗi gì khi pháp vector ngược nhau.

    Mọi mặt phẳng trong không gian có phương trình tổng quát có dạng :  Ax + By + Cz +D = 0  Khi đó vectơ  '(A  B  C) là vectơ pháp tuyến của mặt phẳng.

    Vì vậy với 1 mặt phẳng, theo quy ước chỉ có 1 vecto pháp tuyến mà thôi.

    Điều này hình như có liên quan đến quy tắc bàn tay phải, nghĩa là: nếu ta bẹt 3 ngón tay của bàn tay phải sao cho vuông góc nhau như 3 trục hệ toạ độ vuông góc: ngón tay trỏ là hướng dương trục Ox, ngón tay giữa là trục Oy thì ngón tay cái là vecto pháp tuyến của trục Oz.


  7. 59 phút trước, ndtnv đã nói:

    Có lẽ hàm dxf có chứa entget nên chạy chậm, trong khi đó acet-dxf không chứa entget.

    Nếu sửa như sau:

    (defun dxf (k e) (cdr (assoc k e))) 

    Tạo 1 đối tượng có dxf 10

    • cadvietlisp.lsp
      lisp help
    •  
    
    (setq el (entget(entlast)))
    
    (defun test (n / t0 t1 t2)
        (setq t0 (getvar "MILLISECS"))
        (repeat n (dxf 10 el))
        (setq t1 (getvar "MILLISECS"))
        (repeat n (acet-dxf 10 el))
        (setq t2 (getvar "MILLISECS"))
        (list (- t1 t0) (- t2 t1) (/ (- t1 t0 0.0) (- t2 t1)))
    )
    (test 1000000)
    
    

    Sau đó đổi vị trí cho dxf nằm sau acet-dxf

    test thử trong cả 2 trường hợp dxf vẫn nhanh hơn acet-dxf

    Đúng rồi@ndtnv, hàm DXF của @ndtnv đề nghị không chứa entget, tuy giống với acet-dxf nhưng chạy nhanh hơn vì hàm DXF này tạo trực tiếp tại lisp không phải gọi từ trong acetutil.arx, acetutil*.fas. Còn nếu có thêm entget như thế này: (defun dxf (k e) (cdr (assoc k (entget e)))) nếu gọi 1 lần thì thì chạy nhanh hơn, nhưng nếu gọi nhiều lần thì chắn chắn sẽ chậm hơn.

    Thân ái.


  8. Vào lúc 12/7/2020 tại 08:55, quocmanh04tt đã nói:

    Lisp bác @thiep post thiếu hàm DXF.

    @alibaba2209: Bạn copy hàm này vào lisp:

    (defun dxf (k e) (cdr (assoc k (entget e))))

    Cảm ơn @quocmanh04ttđã phát hiện thiếu hàm DXF. Sau này Thiệp thấy hàm DXF tự tạo này chạy chậm hơn so với hàm acet-dxf (có sẵn trong acetutil.arx, acetutil*.fas) và dần dần Thiệp thay thế DXF bằng acet-dxf.

    @alibaba2209Lisp được rút gọn "đẩy" các text có sẵn ra khỏi đường bao. Lệnh là OT6.

    ex: Nếu với BV của bạn có nhiều text và đường bao quá gần nhau, bạn nên dùng lệnh ISOLATEOBJECTS kèm cách chọn đối tượng CP, để chỉ hiện những đối tượng cần thực hiện lisp, còn các đối tượng khác sẽ ẩn.

    ;;;  Lisp move các *text tai duong bao ra xa khoi duong bao (lwpolyline) 
    ;;; by: Trân Thiêp, 07/2020, tel: 0918841230
    ;;;================================================================
    (defun Get-2Area (lst)
        (apply '+ (mapcar '(lambda (a b) (- (* (car b) (cadr a)) (* (car a) (cadr b))))
                          lst (cons (last lst) lst)
                  )
        )
    )
    (defun get_point_above_curve (EntCu pt / param ang)
      (if (setq param (vlax-curve-getParamAtPoint EntCu pt))
          (setq ang (angle '(0 0 0) (vlax-curve-getFirstDeriv EntCu param)))
      )
    )
    ;;;================================================================
    (defun c:OT6 (/ tsobj ent_org lstpo dis hei po pone a90 ssT entT ang n)
        (command "undo" "be")
        (defun *error* (msg)
            (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
                (princ (strcat "\n** Error: " msg " **"))
            )
            (acet-sysvar-restore)
            (command "undo" "en")
            (princ)
        )
        (acet-sysvar-set '("cmdecho" 0 "osmode" 0))
        (or ucshold_thiep (setq ucshold_thiep (acet-ucs-get nil)))
        (acet-ucs-cmd '("w"))
        
        (while (OR (NOT (setq ent_org (car (entsel "\nPick a Curve \U+0111\U+01B0\U+1EDDng bao"))))
                   (NOT (eq (acet-dxf 0 (entget ent_org)) "LWPOLYLINE"))
               )
            (prompt "\nPick ch\U+01B0a \U+0111úng Curve vui lòng pick l\U+1EA1i")
        )
        (setq lstpo (ACET-GEOM-VERTEX-LIST ent_org))
    ;;;    ========
        (if (eq (getvar "userr3") 0)
            (setvar "userr3" 20)
        )
        (if (null
                (setq dis (getreal
                              (acet-str-format "\nrKho\U+1EA3ng cách move các text ra xa \U+0111\U+01B0\U+1EDDng bao: <%1> "
                                               (rtos (getvar "userr3") 2 2)
                              )
                          )
                )
            )
            (setq dis (getvar "userr3"))
        )
        (setvar "userr3" dis)
        (if (< (Get-2Area lstpo) 0)
            (setq a90 (/ pi 2))
            (setq a90 (- (/ pi 2)))
        )
        (setq n -1)
        (prompt
            "\nCh\U+1ECDn các \U+0111\U+1ED1i t\U+01B0\U+1EE3ng text t\U+1EA1o \U+0111\U+01B0\U+1EDDng bao c\U+1EA7n move ra ngoài "
        )
        (setq ssT (ssget '((0 . "*TEXT"))))
        (while (setq entT (ssname ssT (setq n (1+ n))))
            (setq po   (acet-dxf 10 (entget entT))
                  pone (vlax-curve-getClosestPointTo ent_org po)
                  ang  (+ a90 (get_point_above_curve ent_org pone))
            )
            (vla-move (vlax-ename->vla-object entT)
                      (vlax-3d-point po)
                      (vlax-3d-point (polar pone ang dis))
            )
        )
        (acet-ucs-set ucshold_thiep)
        (acet-sysvar-restore)
        (command "undo" "en")
        (princ "\nOk")
        (princ)
    )

     

    • Like 1

  9. 14 giờ trước, alibaba2209 đã nói:

    + không được anh à! lệnh ấn vào đường line thì lỗi, anh xem lại dùm

    + em muốn khi quét toàn bộ đối tượng, những text nào nằm trên đường line thì di chuyển gốc text, hoặc copy điểm gốc text ra ngoài đường bao. Mục đích để khi nối các tam giác với nhau thì sẽ bao hết đường bao San Nền

    file đính kèm: xx.dwg

    Chờ bạn trả lời cho câu hỏi quá lâu

    Vào lúc 6/7/2020 tại 10:56, thiep đã nói:

    Text: "43.20" ở đâu ra vậy bạn? do người dùng nhập hay độ cao của polyline? Ứng với mỗi đỉnh (node) của polyline sẽ có 1 text phải không?

    Có thể giup bạn, với đối tượng đường bao là lwpolyline, khoảng cách giữa điểm insertpoint của text với đường bao bao nhiêu, chiều cao text bao nhiêu là do người dùng nhập.

    VÌ vậy Thiệp đã viết lisp cho cả 2 trường hợp. Với trường hợp text có sẵn trên đường bao, lisp vẫn đúng mà bạn. Tuy nhiên với đường bao phức tạp không làm sao tránh được có những text "nhảy ra xa" nhưng vẫn dính đường bao (uốn lõm vào trong như 1 vịnh biển), ngoài ra vì BV của bạn có nhiều đường bao gần nhau, bạn nên dùng lệnh tắt đối tượng (HIDEOBJECTS) gần kề để tránh sai sót.

    • Like 1

  10. 2 giờ trước, ngokiet đã nói:

    Thanks bác. Có điều lệnh cal này hơi khó chịu 1 chút là nếu sai thì dễ gây treo khi lập trình lisp khi chạy thử. Nhiều hàm cũng hay và có hàm lisp tương ứng. Nếu rảnh thì viết lại bằng lisp thì mình nghĩ hay hơn.

    Đúng như bạn Ngô Kiệt nói, Nếu rảnh thì viết lại bằng lisp thì mình nghĩ hay hơn.

    Ví dụ: nếu biết 3 điểm trong không gian, thì tìm vetơ pháp tuyến của mặt phẳng đi qua 3 điểm, cũng không khó, nếu hiểu về hình học giải tích:

    defun normal (p1 p2 p3 / v1 v2)
        (setq v1 (mapcar '- p1 p2)
              v2 (mapcar '- p2 p3)
        )
        (setq n (list (- (* (cadr v1) (caddr v2)) (* (cadr v2) (caddr v1)))
                      (- (* (caddr v1) (car v2)) (* (caddr v2) (car v1)))
                      (- (* (car v1) (cadr v2)) (* (car v2) (cadr v1)))
                )
        )
        n
    )

     

    • Like 1

  11. Lisp của bạn đây, lệnh là OT5

    ;;;  Lisp move các *text tai duong bao ra xa khoi duong bao
    ;;;  Hoac move text elevation duong bao ra xa khoi duong bao (lwpolyline) 
    ;;; by: Trân Thiêp, 07/2020, tel: 0918841230
    ;;;================================================================
    (defun Get-2Area (lst)
        (apply '+ (mapcar '(lambda (a b) (- (* (car b) (cadr a)) (* (car a) (cadr b))))
                          lst (cons (last lst) lst)
                  )
        )
    )
    (defun aText (pt height str lay)
        (setq objText (vla-AddText *Model* str (vlax-3d-point pt) height))
        (vla-put-Alignment objText acAlignmentMiddleCenter)
        (vla-put-TextAlignmentPoint objText (vlax-3d-point pt))
        (vla-put-layer objText lay)
    )
    (defun get_point_above_curve (EntCu pt / param ang)
      (if (setq param (vlax-curve-getParamAtPoint EntCu pt))
          (setq ang (angle '(0 0 0) (vlax-curve-getFirstDeriv EntCu param)))
      )
    )
    ;;;================================================================
    (defun c:OT5 (/ ApCad ActDoc *Model* newFontFile tsobj ent_org ent_of1 ent_of2 obj_org lstpo_org lstpo_of1 bit lstpo_of2 dis off eng ele hei lay tz po1
                    po2 po pone poin an ssT ang prm)
        (command "undo" "be")
        (defun *error* (msg)
            (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
                (princ (strcat "\n** Error: " msg " **"))
            )
            (acet-sysvar-restore)
            (command "undo" "en")
            (princ)
        )
        (acet-sysvar-set '("cmdecho" 0 "osmode" 0))
        (or ucshold_thiep (setq ucshold_thiep (acet-ucs-get nil)))
        (acet-ucs-cmd '("w"))
        (setq ActDoc  (vla-get-ActiveDocument (vlax-get-acad-object))
              *Model* (vla-get-ModelSpace ActDoc)
              *TextStyles* (vla-get-TextStyles actDoc)
        )
        (setq newFontFile (acet-file-find-font "arial.TTF"))
        (if (not (tblobjname "STYLE" "Arial"))
            (progn (setq tsobj (vla-add *TextStyles* "Arial"))
                   (vla-put-FontFile tsobj newFontFile)
            )
        )
        (while (OR (NOT (setq ent_org (car (entsel "\nPick a Curve \U+0111\U+01B0\U+1EDDng bao"))))
                   (NOT (wcmatch (DXF 0 ent_org) "LWPOLYLINE"))
               )
            (prompt "\nPick ch\U+01B0a \U+0111úng Curve vui lòng pick l\U+1EA1i")
        )
        (setq obj_org (vlax-ename->vla-object ent_org))
        (setq lstpo_org (ACET-GEOM-VERTEX-LIST ent_org))
        (setq eng (entget ent_org))
        (setq ele (acet-dxf 38 eng)
              lay (acet-dxf 8 eng)
               
        )
        (setq tz (/ (getvar "viewsize") 50))
        (if (eq (getvar "users1") "")
            (setvar "users1" "Text")
        )
        (initget "Text Elevation")
        (setq tmp (acet-str-format
                      "\nMove t\U+1EA5t c\U+1EA3 text có s\U+1EB5n trên \U+0111\U+01B0\U+1EDBng bao hay t\U+1EA1o các text \U+0111\U+1ED9 cao và move ra các \U+0111\U+1EC9nh \U+0111\U+01B0\U+1EDDng bao: [Text/Elevation] <%1> "
                      (getvar "users1")
                  )
              bit (getkword tmp)
        )
        (or bit (setq bit (getvar "users1")))
        (setvar "users1" bit)
    ;;;    ========
        (Cond ((eq bit "Elevation")
               (setq prm "\nrKho\U+1EA3ng cách t\U+1EEB \U+0111i\U+1EC3m chèn text \U+0111\U+1EBFn \U+0111\U+01B0\U+1EDDng bao: <%1> "))
              ((eq bit "Text")
               (setq prm "\nrKho\U+1EA3ng cách move các text ra xa \U+0111\U+01B0\U+1EDDng bao: <%1> ")))
        (if (eq (getvar "userr1") 0)
            (setvar "userr1" 20)
        )
        (if (null (setq dis (getreal (acet-str-format prm (rtos (getvar "userr1") 2 2)))))
            (setq dis (getvar "userr1"))
        )
        (setvar "userr1" dis)
        (if (< (Get-2Area lstpo_org) 0)
            (setq off (- dis)
                  an   (/ pi 2)
            )
            (setq off dis
                  an (- (/ pi 2))  
            )
        )
        (cond ((eq bit "Elevation") (if (eq (getvar "userr2") 0)
                                        (setvar "userr2" tz)
                                    )
                                    (if (null (setq hei (getreal (acet-str-format "\nChi\U+1EC1u cao ch\U+1EEF: <%1> "
                                                                                  (rtos (getvar "userr2") 2 2)
                                                                 )
                                                        )
                                              )
                                        )
                                        (setq hei (getvar "userr2"))
                                    )
                                    (setvar "userr2" hei)
                                    (vla-offset obj_org off)
                                    (Setq ent_of2 (entlast))
                                    (setq lstpo_of2 (ACET-GEOM-VERTEX-LIST ent_of2))
                                    (setq n 0)
                                    (Setvar "textstyle" "arial")
                                    (repeat (length lstpo_of2)
                                        (setq po1 (nth n lstpo_org)
                                              po2 (nth n lstpo_of2)
                                        )
                                        (setq po (polar po1 (angle po1 po2) dis))
                                        (aText po hei (rtos ele 2 1) lay)
                                        (setq n (1+ n))
                                    )
                                    (entdel ent_of2)
              )
              ((eq bit "Text")
               (setq n -1)
               (prompt "\nCh\U+1ECDn các \U+0111\U+1ED1i t\U+01B0\U+1EE3ng text t\U+1EA1o \U+0111\U+01B0\U+1EDDng bao c\U+1EA7n move ra ngoài ")
               (setq ssT (ssget '((0 . "*TEXT"))))
               (while (setq entT (ssname ssT (setq n (1+ n))))
                   (setq po  (acet-dxf 10 (entget entT))
                         pone  (vlax-curve-getClosestPointTo ent_org po)
                         ang (+ an (get_point_above_curve ent_org pone))
                   )
                   (setq poin (polar pone ang dis))
                   (vla-move (vlax-ename->vla-object entT) (vlax-3d-point po) (vlax-3d-point poin)) 
               )
              )
        )
        (acet-ucs-set ucshold_thiep)
        (acet-sysvar-restore)
        (command "undo" "en")
        (princ "\nOk")
        (princ)
    )

     

    • Like 2

  12. Vào lúc 3/7/2020 tại 15:30, alibaba2209 đã nói:

    EM chạy San nền khi quét chọn đối tượng để tạo lưới tam giác thì phần mềm nhận dạng ở điểm gốc text, nên khi những gốc text không trùm lên đường bao san nền sẽ bị lỗi vì thế em muốn nhờ anh chị viết 1 lsp để sử lý tình huống này

    Em có 1 đường bao khép kín, giờ em muốn các điểm gốc text nằm ngoài đường bao, cách khoảng 2cm

    Untitled.png

    Text: "43.20" ở đâu ra vậy bạn? do người dùng nhập hay độ cao của polyline? Ứng với mỗi đỉnh (node) của polyline sẽ có 1 text phải không?

    Có thể giup bạn, với đối tượng đường bao là lwpolyline, khoảng cách giữa điểm insertpoint của text với đường bao bao nhiêu, chiều cao text bao nhiêu là do người dùng nhập.


  13. Vào lúc 2/7/2020 tại 09:00, dexoso123 đã nói:

    Dear anh chị em

    - Em có bản đồ đo đạc địa hình tự nhiên và em cần khoanh vùng các khu vực có cao độ trong 1 khoảng nhất định để tiện cho việc đánh giá địa hình. Anh chị chỉ giúp xem làm bằng cách nào được. (Em chỉ sài bộ HS của Hài hòa)

    Cảm ơn anh chị

    Đây là 1 bản đồ địa hình đánh giá độ sâu từ -8 đến -15m

     

    Muốn được như vậy, bạn phải dùng dữ liệu đo địa hình, chạy trên phần mềm Sufer, tạo đường contuor, rồi lấp đầy màu nền từ cốt -8m đến -15m.

    Nếu dữ liệu đo không còn, thì bạn phải làm bài toán ngược: từ các đường contuor có độ cao, dùng lisp tạo ra file dữ liệu đo chi tiết, rồi mới chạy Sufer.

    Còn cách tạo như thế nào trên Sufer chắc bạn bên trắc đạc, thì phải học Sufer rồi.

     

     

    image.png


  14. 3 giờ trước, DuongTrungHuy đã nói:

    Mình có viết cái này. Nếu Bạn nào cần để làm ăn thì xem nhé.

     

    Lệnh rất tuyệt, việc nắn contuor theo 1 đoạn spline cũng rất tuyệt. Thiệp chỉ góp ý 1 điều thôi: tạo label cao độ cho contuor, chỉ cần pick 1 điểm (nearest) là đủ, lisp sẽ tính toán góc quay của Text = góc tiếp tuyến tại điểm pick. Thân ái.

    • Like 1

  15. Vào lúc 18/6/2020 tại 09:08, dinhtuong18 đã nói:

    em cảm ơn thầy đã giúp đỡ,lisp dùng rất ok rồi,nhưng nếu có thể thầy giúp em thêm mục nhập chiều dài muốn kéo giãn hoặc co lại thay vì kéo chuột đc ko ạ,vì kéo chuột như thế sẽ ko đc chuẩn ạ

    Việc kéo chuột thể hiện được tính động khi co hay kéo, còn muốn chính xác khoảng cách cũng được,
    Yêu cầu người dùng nhập thêm kích thước thanh thép, khi đó lisp sẽ tính toán nếu chiều dài thanh thép > (N*chiều dài khoảng cách 2 "tâm" hệ lỗ) + khoảng cách 1 biên thì sẽ tạo thêm N hệ lỗ. (N là số nguyên không âm).
    Chờ sẽ có lisp được fix.

    • Like 1

  16. Vào lúc 10/6/2020 tại 22:41, vcdichoi đã nói:

    Vâng em cảm ơn anh.

    Anh cho em hỏi thêm chút xíu.

    Khi em load lisp vào bản vẽ và lần đầu nhập "tdt" để gọi lệnh thì xuất hiện : "Drawing Scale" để nhập khai báo tỷ lệ?

    Nhưng lần sau nhập "tdt" để  gọi lệnh thì không xuất hiện "Drawing Scale" nữa, muốn "Drawing Scale" xuất hiện lại phải tắt bản vẽ và load Lisp lại từ đầu.

    Vậy có cách nào để có thể xuất hiện "Drawing Scale" khi mình muốn mà không cần phải mở bản vẽ lên và load lại lisp cad .

    Em xin cảm ơn!

     

    zzz.png

    bạn tìm đoạn mã này:

        (if (= tl nil)
            (progn (setq tl (getreal "\nDrawing scale : ")) ;    (setq ntl (/ 1 tl))
                                                      ;    (setq tl2 (* ntl ntl))
            )
        )

    và thay bằng duy nhất 1 dòng mã:   (setq tl (getreal "\nDrawing scale : "))

    Tuy nhiên, nhìn chung lisp này viết không hay.


  17. Vào lúc 9/6/2020 tại 20:35, hanh.phuc đã nói:

    Không đúng ý của người yêu cầu đâu bạn, lisp làm sao chỉ tạo 1 polyline và đánh số TT vào giữa tâm hình chữ nhật hay hình vuông nữa.

    • Vote giảm 1
×