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

quansla

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

    672
  • Đã tham gia

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

  • Ngày trúng

    18

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


  1. Giản lược thế, khó hình dung quá, mà có ai đào tạo gì đâu mà thầy với chả tớ

    1. Đường tim màu đỏ lúc nào cũng đứt đoạn à (hay là cả Tim là 1 Polyline dài ngoằng có cả cong, cả thẳng, cần đoạn nào thì Pick điểm trên nó); Tim đó lúc nào cũng bị "là phẳng" (làm đồng phẳng rồi à) bắt buộc nhập thủ công cao độ đầu + cuối sao.

    2. Hố ga cần tính là Tâm của hai đường chéo cái hình chữ nhật trắng ấy à, Hố ga có trước chỉ xác định cao độ rồi Insert ATT tại đúng vị trí đó, hay Pick vào đâu thì insert hố ga và ATT vào đấy

    3. ATT đó đâu?

    4. Nội suy cao độ hố ga theo phương án nào: đơn giản nhất là: nội sung tuyến tính (nội suy 1 chiều, theo phương của đoạn thẳng TIM màu đỏ); cách này bắt buộc các thông số sau bảo đảm: Tim màu đỏ là 1 đoạn thẳng (hoặc 1 phần đoạn thẳng) không chứa đoạn cong; hố ga bất kỳ cùng thuộc 1 đường gióng Vuông góc với tim luôn sẽ có cao độ nội suy bằng nhau;

    còn nếu có cách nội suy khác thì đề nghị làm rõ thêm

     

    Chủ thớt nên cho file kết quả đê, và cả cách tính nữa nhé

     

     

    chu y : LISP HOAT DONG SAI KHI PICK VI TRI HO GA NAM NGOAI GIOI HAN DOAN THANG DUONG TIM
    (defun c:thunghiem( / caodocuoi caododau dodoc dt duong_tim kqnoisuy L obj p p0 tongL)
    (vl-load-com)
    (defun dxf (n ent) (cdr(assoc n ent)))
    (defun get_cao_do(flag / caodo num)
    (princ "\nChon cao do diem")
    (setq num
    (cond
    ((and (setq caodo (car(entsel (acet-str-format "\nNhap cao do diem thu %1" flag))))
    (member (type (setq num (read (dxf 1 (entget caodo))))) '(REAL INT)))
    num)
    ((getreal (acet-str-format "\nNhap cao do diem thu %1" flag)))
    (T (princ "\nBan chua chon duoc cao do"))))
    num)
    
    (if (and
    (setq duong_tim (entsel"/nChon duong thang tam"))
    (if (wcmatch (dxf 0 (entget (car duong_tim))) "*LINE") (setq dt (car duong_tim)))
    (setq obj (vlax-ename->vla-object dt))
    (setq caododau (get_cao_do 1))
    (setq caodocuoi (get_cao_do 2))
    )
    (while (setq p (getpoint "\nNhap toa do ho ga"))
    (setq dodoc (* 100 (/ (- caodocuoi caododau) (setq tongL (vlax-curve-getdistatparam obj (vlax-curve-getendparam obj))))))
    (setq L (vlax-curve-getdistatpoint obj (setq p0 (vlax-curve-getclosestpointto obj p))))
    (setq kqnoisuy (+ caododau (* (/ L tongL) (- caodocuoi caododau))))
    (entmakex
    (list
    (cons 0 "TEXT")
    '(100 . "AcDbEntity")
    '(100 . "AcDbText")
    (cons 10 p)
    (cons 8 "caodo_hoga")
    (cons 11 p)
    (cons 1 (acet-str-format "Do doc %1 ; Cos HG: %2" dodoc kqnoisuy))
    (cons 40 (* 0.01 tongL))
    '(71 . 0)
    '(72 . 0)
    '(73 . 0)))
    ))
    (princ))
    

  2. Vẫn chưa thật rõ ràng, khó giúp quá: tiêu đề là Pick mà trong yêu cầu là quét.

    Theo mình: san nền những cái Block ATT kia đã có do phần mềm xuất ra, có số liệu + vị trí chuẩn rồi thế thì sao không là:

    B1: gõ lệnh

    B2: Pick chọn danh giới san nền (đường màu xanh)

    B3: Lisp tự lọc các Block ATT nằm trong gianh giới xác định ở trên, Xác định điểm chèn Block cho từng block, đọc-ghi nhớ các giá trị tọa độ XY (có cần đổi lại thứ tự không ???) sau đó lựa chọn: ghi ra file cvs, txt, hay là bảng Table của Cad (???)

    B5: kết thúc lệnh


  3. Mình không làm thế bao giờ, toàn có đối tượng rồi mới DIM, cơ mà mình thử máy mình (Cad 2012) thì vẫn được nhỉ, nếu khó quá bạn có thể sử dụng thêm chức năng From (tính từ điểm) từ menu ngữ cảnh (khi chuột Phải) xem

    Thao tác:

    Gõ lệnh DLI,

    Bắt điểm A,

    Shift + chuột phải, From,

    Pick từ điểm B(B có thể trungf với A) rê chuột, tạo hướng, gõ khoảng cách và xong


  4. Trước thì mình học theo cuốn này, tương đối dễ hiểu, bạn xem thực hành, đối chiếu với các chương trình các bác khác xem nhé, chúc thành công

    http://www.cadviet.com/upfiles/7/101306_31609_the_dcl_autolisp_tutorial.pdf

     

    Nói sơ qua thì như thế này: sách (cho ở trên) làm theo cổ điển, sách giáo khoa, từng bước từng bước; còn hiện tại thì mình dùng cấu trúc của Lee ( http://lee-mac.com/tutorials.html) Nói chung đều thực hiện các công việc sau

    1. Load file DCL (file này phải được đặt trong thư mục Support của CAD: cú pháp lệnh (setq dcl_id (load_dialog "Tenfile.DCL"))

    2. Giống như LISP trong một file *.LSP có thể có nhiều cú pháp câu lệnh Lisp, nhiều hàm khác nhau mà trong File DCL cũng có thể chứa nhiều cú pháp hộp thoại khác nhau, sau khi truy cập được vào đến file DCL, thì truy cập đến hộp thoại theo cú pháp (new_dialog "Ten_DCL" dcl_id): chạy load hộp thoại có tên TEN_DCL trong file tenfile.dcl

    3. Sau khi đã vào được thì gán các dữ liệu ban đầu, xứ lý hành động khi người dùng (user) pick, nhấn, sửa đổi, ghi nhận trong hộp thoại, nói chung là tương tác 2 chiều giữa User và Cad. Sau các dòng cú pháp này thì sẽ luôn có dòng (start_dialog) là mã dùng để Cad biết khi đọc đến dòng cú pháp này thì cho hiện hộp thoại nên

    4. Cuối cùng khi cần kết thúc hiện hộp thoại thì dùng cú pháp (unload_dialog dcl_id) dùng để Unload file DCL (file "Tenfile.DCL" được save cho dcl_id)

    chúc bạn thành công

    • Vote tăng 1

  5. Bạn đã cài Experss Tools cad chưa, nếu chưa thì LISP sẽ không chạy, nếu rồi bạn chịu khó sửa lại thêm dòng

    (vl-load-com) vào đầu file LISP và Load lại nhé nếu lười thì tải lại líp như sau:

     (defun c:11111(/ obj ss)
      (vl-load-com)
      (if (setq ss (ssget '((0  . "DIM*"))))
        (foreach dt (acet-ss-to-list ss)
          (setq obj (vlax-ename->vla-object dt))
          (if (= (vla-get-verticaltextposition obj) 1)
    (vla-put-verticaltextposition obj 4)
    (vla-put-verticaltextposition obj 1)
    )
          )
        )
      (princ)
      )
    
    • Like 1

  6. cho mình hỏi muốn tạo Dim có nhánh nhỏ để đo bán kính như hình  thì làm thế nào ạ, thanks!

     

     

    Không phải dim nhánh nhỏ đâu, đấy là Override, bạn thấy cái nút thứ 4 từ trên xuống bên phải không, bạn ấn nút đó sau đó đổi theo ý muốn và sử dụng thôi, dùng nhiều sẽ thấy nó chưa hay đâu, bạn nếu dùng để bán kính nên sửa trong Properties ý (Ctrl+1) sẽ dễ hơn, Matchop được, tùy sửa được thoải mái


  7. Mình  làm việc với số lượng dim rất nhiều nên ngồi dim rất vất vả bạn à, với lại các đối tượng nó gần nhau nên nhiều khi pick nhầm nữa, nói chung là nếu không quan trọng với mình thì mình đâu có tạo topic để nhờ đâu ?

    Thứ 2 vấn đề của mình là làm bên thiết kế nhiều khi ước tính chia khoảng cách các đối tượng, nếu ko phù hợp thì lại gộp dim lại rồi chia ra, đở mất công ngồi dim lại từ đầu, với số lượng dim là rất nhiều.

     

     

    Cái này là ăn theo kiểu làm việc của Revit mà, cơ mà theo mình nghĩ làm thiết kế quan trọng là cẩn thận thôi, bỏ công sức ra một chút, bé quá mà pick nhầm thì Zoom lên, trích tỉ lệ lớn, chọn DIM nhỏ hơn rồi Ma lại; bỏ qua không trích nữa - trích cái chính thôi

    Mình nghĩ là nếu các pro viết thì viết được, nhưng có cần thiết không, có lệ thuộc vào LISPer quá không?


  8. Nếu có file thì sẽ dễ hơn, đặc biệt file Cad, nhưng nếu chỉ cần ra kết quả tương tự thì mình nghĩ bạn dùng LEADER thì hay hơn, Dùng Leader chỉ đến điểm cần đánh dấu (dùng mũi tên Block DOT để có cái tròn tròn đậm, đầu LEADER giống hình) còn cuối mũi tên tạo thêm TEXT vào là được, số liệu thì đo thủ công và Eddit lại, sẽ nhanh hơn

     

    Còn nếu cần DIM Mesion thì mình cũng chưa nghĩ ra


  9. [Thuật toán]
       BƯỚC 1: GÕ LỆNH CHỌN TẬP HỢP CÁC ĐỐI TƯỢNG (có thể kết hợp chỉ chọn PLINE,LINE) dùng qua hàm

    (ssget '(( 0 . "LINE,LWPolyline")))

       BƯỚC 2: LỌC QUA TOÀN BỘ ĐỐI TƯỢNG LÀM CÁC CÔNG VIỆC SAU:
            - Lấy chiều dài của đối tượng đang sử lý (có ename được setq là "dt") gán giá trị này cho biến "L"
            - Lấy 1 điểm trên (gần) Pline, Line làm điểm chèn TEXT ký hiệu điểm này là p
            - Entmakex TEXT (hoặc Mtext) giá trị L tại điểm chèn p đã có ở trên
       BƯỚC 4: KẾT THÚC LỆNH
    [ VÍ DỤ]
    http://www.cadviet.com/forum/topic/47335-da-xong-lisp-xuat-chieu-dai-line-ra-text-co-san-va-co-tien-to-hau-to/
    [ Ví dụ 2]
     

    (defun c:test()
      (defun vText(str p k / xp yp)
        (entmakex
          (list
    '(0 . "TEXT")
    '(100 . "AcDbEntity")
    '(100 . "AcDbText")
    (cons 1 str);string
    (cons 7 (getvar "textstyle"));style
    (cons 8 (getvar "clayer"));layer
    (cons 62 256);color
    (cons 10 p);insertion point
    (cons 11 p);alignment point
    (cons 40 k);text height - change by suit
    (cons 41 1.0);text width
    (cons 50 0.0);1.5708 - vertical, 0.0 - horizontal
    (cons 51 0.0);oblique angle
    '(71 . 0);alignment
    '(72 . 0);alignment
    '(73 . 0);alignment
    )
          )    
        )
      (vl-load-com)
      (foreach dt (acet-ss-to-list (setq ss (ssget '(( 0 . "*LINE")))))
        (setq p (cdr(assoc 10 (entget dt))))
        (setq L (vla-get-length (vlax-ename->vla-object dt)))
        (vText (rtos L 2 4) p 25))
      (princ))
    


     

    Toàn bộ (defun vtext .... để xác định hàm con với 3 tham số đầu vào [nội dung string ; điểm chèn p; chiều cao chữ k] sẽ hoạt động in ra màn hình một Dtext với nội dung như string, tại điểm chèn p; với chiều cao chữ k

    Phần hoạt động chính chỉ đơn giản như sau:

     

      - foreach --... lọc qua một lượt toàn bộ đối tượng.

      - (setq p (cdr(assoc 10 (entget dt)))) xác định điểm p trên đối tượng

      - (setq L (vla-get-length (vlax-ename->vla-object dt))) xác định chiều dài từng đối tượng.

      - vtext (rtos L 2 4) p 25    in ra màn hinh Dtext nội dung "L", tại điểm p, chiều cao 25

    kết thúc


  10.  

    Cám ơn bác gia_bach, có thể mình mới chuyển sang dùng autocad.net nên chưa nắm chắc cú pháp, hiện tại mình dùng cad 2007 và vb2008. Bác có thể xem giúp mình code dưới có vấn đề gì không ah.

    Sub ....
    

    Mọi người cho em hỏi, bình thường em thấy mọi người hay hỏi nhau VB trong Cad, có lẽ là viết cùng ngôn ngữ VBA như Excel (cái này thì em mù tịt). Vậy cái VB Cad này có chỗ nào để viết, lấy nguồn cơ sở ở đâu, nó không có sẵn khi cài Cad phải không?, (em thấy vẫn load được các file các anh viết (dạng dll) và chạy trên máy em, vậy nó cho dùng nhưng không cho sửa viết = Cad ư)

    Như em thấy Cad thì Visual Lisp chuyên viết LISP cad, Excel thì ALT+F11 thì phải (cũng là Visual Basic for Applications cho phần mềm OFF, vậy cái VB cho Cad này dùng gì để viết, các từ khóa lấy kiểu gì, hay tự nhớ, tự viết bằng Note++

     

    xin lỗi mọi người nếu em hỏi gà quá nha!


  11. [Hỏi]

    Các bác cho hỏi, trong Dialog của AutoLisp, thì có thể thay đổi cỡ chữ (Size) và Font chữ của các Label, danh sách, danh sách thả xuống, edit_box,... được không? nếu được thì cách làm như thế nào,

    Hiện trong việc xử lý đối tượng: List_box, hoặc Popup_list chữ và Font hiện tại hơi nhỏ, mắt lại kém,. Mở rộng hơn, liệu có thể đổi màu chữ trong các đối tượng trên không?

    xin cảm ơn


  12. [Hỏi]

    Các bác làm ơn cho hỏi , trong khi viết LISP đến phần hộp thoại Dialog thì trong cấu trúc cú pháp LISP làm thế nào để căn chỉnh độ rộng các dòng cho đồng đều

    Chẳng hạn em có CODE như sau:

      

    
    

    quan_thong_so : dialog {label = "THIET LAP THONG SO CHO TINH TOAN THONG KE THEP";

      :row{

         :boxed_column{label = "Thong so chinh";

            :popup_list {key = "lt_L"; label = "Lam tron cho L (chieu dai 1 thanh)          .";width = 3;}

            :popup_list {key = "lt_TongL"; label = "Lam tron cho TongL (chieu dai Toan bo CK)   .";width = 3;}

            :edit_box {key = "L1t"; label = "Chieu dai 1 thanh thep (11700 mm)           .";width = 3;}

            :edit_box {key = "Noi"; label = "He so noi thep (30D)                        .";width = 3;}

            :popup_list {key = "lt_Noi"; label = "Boi lam tron moi noi (25,50,100)            .";width = 3;}

            }

          :boxed_column{label = "TT";

             }

           }

       ok_cancel;

       }

     

     

     

    Khi đó nếu dùng Vlisp vào Tools/ Interface Tools/ Preview DCL Editor thì bảng hiện lên không có độ rộng đều nhau, dù em đã cố gắng để string của các mục có tổng chữ cái như nhau mà không được

    Các bác có phương án nào khác không ạ?

    xin cảm ơn


  13. Dùng VBA trong Exlce liên kết với Autocad thì mình thấy okie, gửi file định dạng của bạn thử xem nhé

     Bạn cho hỏi, liên kết VBA và Cad đã là mặc định của Cad chưa, có cần cài thêm gì không, vì mình thấy trong Cad có Vlide (trình chỉnh sửa Editor của ngôn ngữ LISP) nhưng không có trình Editor của VBA (kiểu như ALT+F11 trong Excel) nhưng lại cho phép load một số file dll


  14. Trừ đối tượng Hatch, bạn có thêm tính năng Annotative với nhiều tỷ lệ khác nhau, để trong các khung nhìn MV khác nhau mà có được tỷ lệ tương đối đều nhau khi in ra (nhưng phải có sự thống nhất giữa tỷ lệ được ADD vào cho Hatch  và tỷ lệ của khung nhìn chứa nó)

    CÒn đối với đối tượng DIM, TEXT bạn không nên Add tỷ lệ Annotative của một đối tượng, nhiều tỷ lệ khác nhau. mà hãy làm ngược lại.

    Mỗi DIm,Text một Annotative. Trong trường hợp đối tượng được thể hiện nhiều lần, ở các tỷ lệ khác nhau. thì các đối tượng DIM,TEXT riêng biệt (có cùng nội dung nhưng khác Layer) để có thể LayOff trong khung nhìn riêng biệt. Hoặc có thể DIM,TEXT thì chỉ vẽ bên Layout (cách này nhiều khi không có lợi)

    Chúc bạn thành công


  15. lâu rồi mình không còn dùng tính năng Annotative nữa, cũng không chắc về tính chính xác (hì hì), theo ý mình thì như sau:

    1. Về yêu cầu đề ra:

     - trong bản vẽ kỹ thuật rất nhiều lúc ta cần thể hiện một bản vẽ các chi tiết ở các tỷ lệ khác nhau (có lớn, có nhỏ) nhằm phục vụ nhu cầu nào đó.

      - điều này dẫn đến yêu cầu về thể hiện đối tượng (khi in ấn) ở nhiều tỷ lệ.

      - kết quả của nó là: ở tỷ lệ 1:100 (tỷ lệ nhỏ) đối tượng được thể hiện vừa vừa (chẳng hạn to bằng 1 móng ngón tay cái), ở tỷ lệ 1:5 (tỷ lệ lớn) đối tượng bị buộc phải khi in ra có diện tích choán khổ giấy trên thực tế lớn hơn (chẳng hạn bằng diện tích 1 bàn tay)

      - nhưng đồng thời toàn bộ DIM, TEXT, Hatch , phải có tính thống nhất về cỡ chữ, cỡ DIM, chủng loại (chẳng hạn TEXT cao 3mm, DIM cao 2.5mm, HATCH cách nhau đều đều các nét 1mm,....)

      - KẾT QUẢ LÀ: TRONG TỶ LỆ NHỎ (1/100) TƯƠNG QUAN (TƯƠNG ĐỐI) GIỮA ĐỐI TƯỢNG VÀ TEXT LÀ: ĐỐI TƯỢNG NHỎ - TEXT NHỎ, TRONG TỶ LỆ LỚN (1/5) LÀ: ĐỐI TƯỢNG TO, TEXT TO. (HÃY GHI NHỚ ĐIỀU NÀY).

    2. Bài toán đặt ra cho AutoCad

     - Phải vẽ ít nhất + luôn vẽ đúng kích thước thật của đối tượng (1m là 1 Đ.V.Cad , 1 cm là 1 Đ.V.Cad, 1005 mm là 1005 Đ.V.Cad -   <Đ.V.Cad = đơn vị Cad ; là quy ước - tạm thời chưa vội hiểu >)

     - Vậy phải giải quyết như thế nào?

    3. Phương án giải quyết của AutoCad

     - Luôn vẽ với tỷ lệ 1:1 = luôn vẽ với kích thước thực tế của đối tượng, nhưng vẽ thế nào là đúng kích thước thật: ở đây nảy sinh vấn đề Đ.V.Cad. Cad định nghĩa như sau: Đ.V.Cad là đơn vị cơ bản nhất của Cad để thể hiện kích thước ngoài đời, Đ.V.Cad có giá trị tương đương đơn vị ngoài đời thực theo quy ước mà người dùng tự quy ước từ đầu ( thường là các đơn vị m,mm,km, dặm,.... chuẩn SI)

                (ngon quá đúng với Yêu cầu 1 của B2 ở trên)

     - Đưa thêm vào công cụ ViewPort (khái niệm không gian thể hiện ViewPort VP Layout và khái niệm không gian vẽ Model bạn cần tự hiểu) để sử dụng thể hiện bản vẽ: công cụ này làm được điều sau:

        + Nếu đối tượng bạn vẽ trong Cad ở không gian Model bạn coi là cây cối ngoài nhà bạn, còn bạn đang ở trong nhà.

        + Lúc này VP được hiểu là các cánh của sổ của nhà bạn: Mỗi VP là một khung nhìn ra ngoài thế giới “thực” (cây cối bên ngoài) ở một hướng nhìn khác nhau, và nếu ta áp vô nó từng loại kính khác nhau và ta lại có thêm được tỷ lệ nhìn khác nhau. Chẳng hạn: nếu ta dùng kính loại Ero Window kính phẳng đẹp, trong suốt, thì sẽ nhìn ra tỷ lệ 1:1, còn nếu ta thay nó bằng kính lúp (loại LỒI, cong, trong suốt) ta sẽ thấy ra tỷ lệ 5:1 (ảnh lớn hơn thực tế) (không đi sâu vật lý nhé)
       - OK đến đây ta có hướng suy nghĩ của anh AutoCad rồi đây:

       + vẽ 1:1 đúng kích thước thật, với điều kiện quy đổi đơn vị Cad và đơn vị ngoài đời thực. Vẽ bằng không gian MOdel

       + Dung Không gian Layout trên đó vẽ các khung nhìn tỷ lệ VP (cánh cửa theo ví dụ trên) sau đó đưa và các loại kính (lúp, Tràng tiện, Ero Window, kính lão, kính ông, kính bà , kính trẻ :D) để “nhìn” đối tượng bên Model.

        + đưa vào TEXT , DIM, Hatch để thệ hiện thêm.

    4. OK Đến đây các Khái niệm bạn hỏi trong ý 1,2 mới hình thành nè:

     

     

     

     

     

    I> Trả lời ý 1: Vì theo KẾT QUẢ (phần viết HOA ở đoạn trên) mà nếu bạn đổi tỷ lệ thì tương quan cỡ chữ và đối tượng thay đổi nên để làm được điều đó sẽ phải có hiện tượng như bạn hỏi.

    II> Trả lời ý 2:

    anotation scale : Chính là ta dùng kính gì đó : Tràng tiền, Ero Window,..... tức là tỷ lệ chuẩn mà bạn sẽ thể hiện đối tượng này.

     

    standard scale: ??? (cái này không biết à nha)

     custome scale. Khi vẽ VP nó mặc định luôn là ZOOM toàn bộ đối tượng được vẽ trong MODEL vừa khít với diện tích VP, hoặc khi lăn lăn con trỏ giữa (Zoom đó bạn) thì tỷ lệ hiển thị thay đổi theo cho khớp với việc lăn lăn này. Lúc này tỷ lệ này là tỷ lệ custome scale,  tỷ lệ này là ngẫu nhiên, thường là không chẵn (chẳng hạn 1:1.5236) nên chỉ mang tính chất tham khảo dugnf để chọn tỷ lệ chuẩn anotation scale

    • Like 1
×