QUẢNG CÁO ĐẦU TRANG

Collapse

Thông báo

Collapse
No announcement yet.

Visual Lisp

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Ðề: Visual Lisp

    Nguyên văn bởi HOÀNG TRUNG HẬU-00X3C
    Cái này em đã thử thêm dấu nháy rồi mà cũng chỉ thực hiện được boundary, còn area thì không thực hiện .
    Có phải khi mình viết 1 đoạn chương trình mà thay đổi các biến hệ thống thì kết thúc phải trả lại đúng giá trị cũ không. Vì em thấy anh Lam đưa biến old_bou, nhưng em không biết vì sao anh lại chuyển giá trị Hpbound=1, hay là nếu giá trị =0 (tức là miền) thì không chọn được. Em lại thấy anh dùng lệnh undo lại rất nhiều, không biết có phải là sau khi tạo được đa tuyến bao kín thì đưa nó về lại nguyên trạng bản vẽ, mà "mark" là gì thế anh? Trước undo có dấu gạch thì theo em là để chuyển ngôn ngữ, ngoài ra còn tác dụng gì ko? Anh giải thích giùm em câu này nha :

    Em đang thử viết thêm 1 đoạn để tính diện tích nhiều hình cùng 1 lúc. Lúc nào viết xong em sẽ đưa lên nhờ các anh chỉnh giúp
    Tặng đồng chí nhé viết làm gì cho mệt óc thử xem có ra gì khổng
    (Defun c:aer ()
    (setvar "cmdecho" 0)
    (command "osnap" "none")
    (setq tl (getreal "\n Scale for Drawing : "))

    (setq r 50 )
    (repeat r
    (setq pt (getpoint "\n Pick point : "))
    (setq am (* tl tl))
    (setq s 0)

    (progn
    (while pt
    (setq entold (cdr (assoc 5 (entget (entlast)))))
    (command "boundary" pt "")
    (setq entnew (cdr (assoc 5 (entget (entlast)))))
    (if (/= entold entnew)
    (progn
    (setq entnew (entget (entlast)))
    (if (assoc 62 entnew)
    (setq
    entnew (subst (cons 62 (+ 3 (cdr (assoc 62 entnew))))
    (assoc 62 entnew)
    entnew
    )
    )
    (setq entnew
    (append
    entnew
    (list
    (cons
    62
    (+ 3
    (cdr
    (assoc 62
    (tblsearch "layer"
    (cdr (assoc 8 entnew))
    )
    )
    )
    )
    )
    )
    )
    )
    )


    (entmod entnew)
    (Command "area" "o" (entlast))
    (setq s (+ s (getvar "area")))
    (setq pt (getpoint "\n Pick point: "))
    (entdel (entlast))
    )
    (progn
    (princ "Error Wrong Point")
    (setq pt (getpoint "\n Pick point: "))
    )
    )
    )

    )

    (setq pt1 (getpoint "\nPick any point to draw area : "))
    (setq dt (/ (* s am) 1000000))
    (setq dt (strcat (rtos dt 2 2) " m²."))


    (Setq ldt (Getstring t "\n Kind of area : "))
    (cond

    ((= ldt "dx") (setq ldt "SÐáxây="))
    ((= ldt "bt") (setq ldt "SBêtông="))
    ((= ldt "d" ) (setq ldt "SÐào="))
    ((= ldt "dd") (setq ldt "SÐ?p="))
    ((= ldt "ph") (setq ldt "SP.hoá="))
    ((= ldt "ck") (setq ldt "SC.khay="))
    ((= ldt "dl") (setq ldt "SDam l?c="))
    ((= ldt "cl") (setq ldt "SCát l?c="))
    ((= ldt "tc") (setq ldt "SÐàoTC="))
    ((= ldt "tcc") (setq ldt "SÐ?p TC="))
    ((= ldt "lk") (setq ldt "SÐálkhan= "))
    ((= ldt "cp") (setq ldt "SC.ph?i= "))
    ((= ldt "dm") (setq ldt "Fdm = "))
    )
    (command "text" pt1 3.0 0 (strcat ldt dt))
    (ALERT (strcat "\t\t
    DiÖn tÝch = " dt))

    ))

    Ghi chú


    • Ðề: Visual Lisp

      Khi chọn xong nó hỏi "Kind of area" là gì vậy Bác?
      KỈ SỞ BẤT DỤC - VẬT THI Ư NHÂN
      Mail: minhbu107@gmail.com
      Add: Thủ Dầu Một - Bình Dương.
      Tel: 0982.391379

      Ghi chú


      • Ðề: Visual Lisp

        Nguyên văn bởi minhce
        Khi chọn xong nó hỏi "Kind of area" là gì vậy Bác?
        ((= ldt "dx") (setq ldt "SÐáxây="))
        ((= ldt "bt") (setq ldt "SBêtông="))
        ((= ldt "d" ) (setq ldt "SÐào="))
        ((= ldt "dd") (setq ldt "SÐ?p="))
        ((= ldt "ph") (setq ldt "SP.hoá="))
        ((= ldt "ck") (setq ldt "SC.khay="))
        ((= ldt "dl") (setq ldt "SDam l?c="))
        ((= ldt "cl") (setq ldt "SCát l?c="))
        ((= ldt "tc") (setq ldt "SÐàoTC="))
        ((= ldt "tcc") (setq ldt "SÐ?p TC="))
        ((= ldt "lk") (setq ldt "SÐálkhan= "))
        ((= ldt "cp") (setq ldt "SC.ph?i= "))
        ((= ldt "dm") (setq ldt "Fdm = "))
        )
        Nếu như bạn cần tính diện tích hình đó là bê tông thì kind là bt
        sẽ ra kết quả lkà Sbêtông=......m²
        OK chứ

        Ghi chú


        • Ðề: Visual Lisp

          Anh Lam và các anh cho em xin hỏi,
          Trong Autocad, mình có thể tạo được 1 đối tượng mới không? Cái kiểu như Dimension ấy. Tức là đối tượng đó có nhiều đối tượng con liên kết nhau (Trong dimension là text hiển thị kích thước và khoảng cách giữa hai điểm gióng), khi tác động làm thay đổi 1 đối tượng thì đối tượng kia cũng sẽ tự thay đổi theo.

          Em vẽ hoàn chỉnh kết cấu 1 cái dầm 4m. Sau đó stretch còn 3,5m chẳng hạn. Em muốn khi đó các khoảng bố trí thép đai cũng sẽ tự stretch theo tỉ lệ đó.
          Mong các anh trả lời em, mình có thể tự tạo loại đối tượng đó không, và dùng chương trình gì để làm.
          Em cám ơn nhiều.

          Ghi chú


          • Ðề: Visual Lisp

            Toi co mot chung trinh thong ke thẹp ban cu ve cay thep ra binh thuọng sau do dung lenh nay no se tinh khong luong cho bạn Theo toi thay cach lam nay rat tiẹn luc thay doi thi lam rat nhanh. Cac ban co the mo file acad tham khao them.
            Attached Files

            Ghi chú


            • Ðề: Visual Lisp

              Anh Lam và các Bạn cho Tôi hỏi:
              Tôi có 1 đói tượng dạng LWPOLYLINE (được vẽ bằng lệnh RECTANG). Vậy trong Visual Lisp làm như thế nào để lấy được tọa độ của các điểm tạo nên đối tượng đó?
              Mong được sự giúp đỡ.
              Thân.

              Ghi chú


              • Ðề: Visual Lisp

                em chi moi lam quen voi autolisp
                mong nhung bac tien boi hay chi giup
                em dang tao menu nhung khong biet lam sao de no co the tao duoc tieng viet co dau
                cac menu cua em chi toan la tieng viet khong dau
                mong cac thay va cac anh giup do
                chan thanh cam mon

                Ghi chú


                • Ðề: Visual Lisp

                  Anh Lâm thân mếm cam mơn rất nhiều về những lời nhắc nhở của anh
                  em thường sử dung font Fixedsys dể tạo hộp thoại và menu, mong anh chỉ giáo để em có thể tạo được menu và hộp thoại tiếng việt.
                  Cám mơn anh nhiều

                  Ghi chú


                  • Ðề: Visual Lisp

                    cam mơn anh Lam nhiệu em mạn phép làm phiền anh một tí thôi. Em có viết được cái lisp để tọa độ của đường thẳng qua excel (lưu dưới dạng csv). Nhưng giờ em muốn làm ngược lại (xuất giá trị trong bảng excel vao trong cad để vẽ thì làm sao hả anh).

                    Ghi chú


                    • Ðề: Visual Lisp

                      Anh Lam ơi em có một file lisp nhưng không hiểu sao phải chọn điểm trước thi nó mới vẽ con nếu mình nhập giá trị trước sau đó mới chọn điểm để nó vẽ thì nó lại không chịu nhờ anh chi giáo giúp. Anh biết tài liệu tiếng việt nào nói ve mấy cái lệnh VLA, VLAX trong cad không. chân thành cám mơn.
                      Thanh
                      Attached Files
                      Last edited by nong truong thanh; 18-10-2006, 10:13 PM.

                      Ghi chú


                      • Ðề: Visual Lisp

                        Nguyên văn bởi nglam_adg
                        Bản thân đối tượng LWPOLYLINE chỉ có thể xác định được 1 điểm (mã nhóm 10) nên nếu dùng cách thông thường thì không thể lấy đủ dữ liệu đỉnh của đối tượng. Cách dễ nhất là dùng "tiểu xảo" tạm thời chuyển nó sang đối tượng LINE. Sau khi có được tọa độ các đỉnh thì trả nó về dạng LWPOLYLINE ban đầu.
                        Đoạn mã lệnh dưới đây sẽ chèn TEXT mẫu vào 4 đỉnh 1 hình chữ nhật (là đối tượng LWPOLYLINE):
                        ----------------------------------------------
                        (defun C:LW (/ rec_lw list_dat_lw ss_obj0 ss_obj2 p10_1 p10_2 p11_1 p11_2 re_sec)
                        (if(setq rec_lw(entsel))
                        (progn
                        (setq list_dat_lw(entget(car rec_lw)))
                        (if(= (cdr(assoc 0 list_dat_lw)) "LWPOLYLINE")
                        (progn
                        (command "._Undo" "M")
                        (command "_.Explode" rec_lw)
                        (setq re_sec (ssget "P" )
                        ss_obj0(entget(ssname re_sec 0))
                        p10_1(cdr(assoc 10 ss_obj0))
                        p11_1(cdr(assoc 11 ss_obj0))
                        ss_obj2(entget(ssname re_sec 2))
                        p10_2(cdr(assoc 10 ss_obj2))
                        p11_2(cdr(assoc 11 ss_obj2)))
                        );progn
                        );if
                        (command "_.Undo" "B")
                        (ins_p p10_1 "1")
                        (ins_p p11_1 "2")
                        (ins_p p10_2 "3")
                        (ins_p p11_2 "4")
                        (setq p10(cdr(assoc 10 list_dat_lw)))
                        );progn
                        );if
                        (princ)
                        )
                        (defun ins_p (p tt)
                        (command "_.TEXT" "J" "M" p "1" "" tt )
                        )
                        ----------------------------------------------
                        .
                        Cho em hỏi bác Lâm, em đang cần cái lisp để lấy số liệu tọa độ 1 điểm trong CAD xuất ra txt. Thông thường em phải copy số x=****, y=**** sau khi dùng lệnh ID và copy sang exel, rất mất thời gian. Bác có cái nào giúp em bớt công đoạn copy and paste nhàm chán đó không???

                        Ghi chú


                        • Ðề: Visual Lisp

                          Cám ơn Anh Lam đã chỉ cách lấy các điểm tạo nên 1 polyline. Trong thời gian đó Tôi cũng đã tìm được cách lấy các điểm đó (đoạn code bên dưới), mong Anh Lam xem và cho ý kiến về đoạn code này.
                          (defun c:laydiem (/ alist stt blist m a11 ptx pty pt1)
                          (SETVAR "CMDECHO" 0)
                          (princ "\nChon polyline>:")
                          (setq alist (ssget '((0 . "LWPOLYLINE")))
                          stt 0
                          )
                          (REPEAT (SSLENGTH alist)
                          (SETQ blist (entget (ssname alist stt))
                          m 0
                          )
                          (while (< m (length blist))
                          (setq a11 (nth m blist)
                          m (1+ m)
                          )
                          (if (= "10" (rtos (car a11) 2 0));diem dau cua duong thang, diem cuoi la 11
                          (progn
                          (setq pt1 (list (cadr a11) (caddr a11)))
                          (command "_.donut" 0 300 pt1 "")
                          )
                          );if
                          );while
                          (setq stt (1+ stt))
                          );repeat
                          (princ)
                          )

                          Ghi chú


                          • Ðề: Visual Lisp

                            Anh Lam có thể chỉ giúp Tôi chọn tất cả các đối tượng là polyline trên lớp layer1 thuộc chế độ model (hoặc layout1, layout2, ...)
                            .........
                            (setq #CTAB (GETVAR "CTAB"))
                            (setq DT (ssget "X" '((-4 . "!and")(8 . "layer1")(0 . "LWPOLYLINE")(-4 . "and>"))))
                            ..........
                            Đoạn code trên chỉ chọn được các đối tượng polyline thuộc layer1 trên cả model và các layout

                            Khi đưa điều kiện model hoặc layout vào thì không sử dụng được
                            .........
                            (setq #CTAB (GETVAR "CTAB"))
                            (setq DT (ssget "X" '((-4 . "!and")(8 . "layer1")(0 . "LWPOLYLINE")(list (cons 410 #CTAB))(-4 . "and>"))))
                            ..........
                            ghi chú: dấu ! được thay bởi dấu <
                            Mong Anh Lam chỉ giúp.
                            Thân.

                            Ghi chú


                            • Ðề: Visual Lisp

                              Cho em hỏi cách làm lsp mà dim được 2 đối tượng với:
                              Ví dụ mình có 4 điểm
                              *(p1) *(ps2)
                              *(p3) *(p4)

                              sau khi chọn điểm p1 thì nó sẽ vẽ thành 2 đường thẳng nối p1--p2, p3--p4 sau đó tự dim cho mình (p3---p1, p1--p2, p3---p4)

                              Vì mới học lisp mà chưa tìm được tài liệu nào nói về cách dim cả, các anh giúp em với!
                              Thanks

                              Ghi chú


                              • Ðề: Visual Lisp

                                Nguyên văn bởi nglam_adg
                                Trong AutoLisp, mọi dữ liệu điểm đều phải xác định - tức là 1 giá trị cụ thể. Chỉ với 1 điểm rất khó có thể tìm được các điểm không xác định còn lại.
                                Sorry anh Lam vì câu hỏi của em chưa được rõ ràng em lấy tạm ví dụ RNDCE
                                Từ một hình chữ nhật có sẵn trên bản vẽ với hai điểmlà L1, L2 -> cần tạo ra một hình chữ nhật mới nằm bên trong hình chữ nhật cũ với các điểm là (L1-2d, L2-2d) trong đó d=min(0.25L1, 0.25L2). Em chạy đoạn lisp trên thì kết quả cho ra tọa độ 3D của một điểm, không tạo được hình chữ nhât.

                                (defun c:rt ()
                                (setq olderr *error*
                                *error* myerror)
                                (setq pt1 (getpoint "\nFirst point of rectangle..."))
                                (setq pt2 (getpoint pt1 "\nCorner of rectangle..."))
                                (setq a(angle pt1 pt2)
                                dis(distance pt1 pt2))
                                (setq co (* dis (cos a))
                                si (* dis (sin a)))
                                (setq delta (min (* 0.25 co) (* 0.25 si)))
                                (setq pta (polar pt1 (* 0.25 pi) (* delta (cos (/ pi 4)) ))) )
                                (setq ptb (polar pta (/ pi 2.0) (- si (* 2 delta))) )
                                (setq ptc (polar ptb 0 (- co (* 2 delta))) )
                                (setq ptd (polar pta 0 (- co (* 2 delta))) )
                                (command "_.pline" pta ptb ptc ptd "c")
                                (setq *error* olderr)
                                (princ)
                                )
                                Bây giờ nếu em muốn dung Lisp để dim 4 điểm (L1 ---(L1-2d)), ((L1-2d) ---(L2-2d)), ((L2-2d)----(L2) thì phải làm thế nào ạ?

                                Ghi chú

                                Working...
                                X