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

BKXD98

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

    32
  • Đã tham gia

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

  • Ngày trúng

    1

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


  1. Hiện tôi đang cần viết 1 lisp định vị 1 điểm (toạ độ x, y) trên đường polyline khi biết khoảng cách từ điểm đó đến hai đầu đường polyline. Nói một cách khác là xác định 1 điểm trên tuyến khi biết lý trình của điểm đó.

    Tôi biết 1 chút về lisp và trước mắt thì không hình dung thuật toán, ý tưởng để viết lisp theo nhu cầu trên như thế nào. Nếu bác nào có thể, vui lòng hướng dẫn giúp tôi. Xin cảm ơn.


  2. Ko hiểu ý bạn cho lắm.Bạn lấy cao độ làm j vậy?Cao độ nhìn thấy rồi còn j(theo như bạn nói:cao độ là số lẻ nằm giữa)

    Cách truy cập vào cơ sở dữ liệu của Block dùng lệnh:Be(Block edit) xem sao?Block cần truy cập trong bản vẽ của bạn có tên là:Elev_Point_BLK2

    Hoặc eidt lại Block thử dùng lệnh ed(edit) xem sao?

    Box này là VBA mà, ý tôi muốn hỏi là đoạn code VBA để lấy giá trị cao độ này.

     

    Do 1 số đơn vị khảo sát tự chế thêm 1 số điểm khảo sát bằng cách chép các block cao độ có sẵn rồi tự sửa lại giá trị cao độ nhưng không để ý đến tọa độ z của block cao độ, nên khi muốn xây dựng lại lưới DTM trên land desktop thì không chính xác.

     

    Tôi muốn viết 1 đoạn code để xuất tọa độ các block cao độ (với tọa độ x,y là tọa x,y của block, tọa độ z là giá trị cao độ của block) sang file txt, để từ file txt này xây dựng lại lưới DTM bằng land desktop hay civil 3d.

    Tôi chỉ không biết đoạn code truy cập vào csdl của block để lấy giá trị cao độ của nó.


  3. Tôi có file bản vẽ được tạo bởi Acad Land Destop, tôi cần lấy các giá trị cao độ của block cao độ (xem trong bản vẽ đính kèm), các block này chứa 4 ATTRIBUTE, trong đó có 2 ATTRIBUTE là phần nguyên và phần lẻ của giá trị cao độ (nếu xem trong bản vẽ đính kèm thì giá trị cao độ là số lẻ nằm ở giữa).

    Các truy cập vào cơ sở dữ liệu của kiểu block này thì tôi chưa biết, mong được các bác hướng dẫn.

    Xin cảm ơn.

     

    File dwg

    • Vote tăng 1

  4. Bạn thử với đoạn này, chắc là không "chuối" nữa!

     

    (defun C:DLF( / d d1 k);;;get DIMLFAC of dimension entity
    (setq  d (entget (car (entsel "\nSelect dimension:")) '("ACAD")))
    (if (setq d1 (cdr (car (cdr (assoc -3 d)))))
    (setq k (cdr (assoc 1040 d1)))
    (setq k (cdr (assoc 144 (tblsearch "dimstyle" (cdr (assoc 3 d))))))
    )
    (alert (strcat "DimLFAC = " (rtos k)))
    )

    Thanks.


  5. Cái "củ chuối" ấy đây! Có thể thay DXF 43 bằng bất cứ cái gì bạn muốn...

     

    (defun DimVal(d / val)
    (command "explode" d)
    (setq Val (cdr (assoc 43 (entget (entlast)))))
    (command "undo" 1)
    Val
    )
    ;;;---------------------------
    (defun C:VD()
    (alert (strcat "Text height = " (rtos (DimVal (car (entsel "\nSelect dimension:"))))))
    )

     

    đúng là củ chuối thật :lol:

    Thanks, anyway.


  6. 1- Dùng cos của góc có một vấn đề bất ổn. Bạn phải phân tích đủ các trường hợp khác nhau (dim thẳng đứng, nằm ngang, với chân dim thì đoạn nào dài, đoạn nào ngắn...) mới có thể xác định chính xác được góc để lấy cos. Thêm nữa, việc phân biệt được góc vị trí (giữa 1 line nối 2 điểm với chuẩn 0 quy ước) là 0 độ hay 360 độ (hoặc 359 hay -1 độ...) là một vấn đề khá đau đầu. Bất đắc dĩ mình mới dùng kiểu này.

    Mình có một hướng khác: bạn lấy DXF 50 sẽ biết là dim nằm ngang hay thẳng đứng. Từ đó sẽ xác định được là cần hoành hoặc tung độ của các điểm 13 và 14 để tính toán.

    2- Hàm entget không lấy được textheigh trong dimension. Bạn dùng (tblsearch "dimstyle" <tên dimstyle>) sẽ lấy được. Nếu chưa đúng ý thì bạn nêu rõ, mình sẽ tìm cách khác (có một cách hơi... "củ chuối" nhưng chắc chắn sẽ lấy được toàn bộ properties của text trong 1 dim bất kỳ, kể cả user có edit nó kiểu gì đi nữa)

     

    1/ Bạn xem lại, cách dùng cos ... là đúng với mọi trường hợp, mục đích của tôi là đúng với dimension có phương bất kỳ, sai sót nếu có là dấu âm (khắc phục bằng hàm abs). Cách này cũng là bất khả kháng do tôi không biết cách lấy 1 tỷ lệ của dimension (nếu lấy được thì khoảng cách thật = kc theo dxf 42 chia cho tỷ lệ của dim).

    2/ Nếu text trong dimension không theo height của textstyle thì không đúng.

     

    Quan điểm của tôi là tìm ra cách giải quyết vấn đề trước đã, bác vui lòng cho tôi biết cách "củ chuối" đó. :lol:

    Thanks.


  7. Bạn dùng DXF 13 và 14, đây là 2 điểm chuẩn với kích thước thật của dimension. Khoảng cách giữa 2 điểm này là cái bạn cần.

     

    không chính xác vì đối với rotateddimension thì nếu đoạn nối 2 điểm 13 và 14 không song song với dimension thì khoảng cách của nó không đúng như mình cần.

     

    Tối hôm qua về nghĩ mãi về nó, cuối cùng cũng tìm ra 1 cách là dùng toán học, khoảng cách thật bằng khoảng cách giữa 2 điểm 13 và 14 nhân với cos của góc tạo bởi điểm 13 và 14 (dùng function angle) trừ đi góc của dimension (mã dxf là 50).

     

    Bây giờ thì tôi cần biết chiều cao của text trong dimension và tổng quát hơn là cách lấy được CSDL của tất cả các đối tượng trong dimension.

    Thanks.


  8. Hiện nay, tôi đang viết 1 tiện ích sắp xếp lại các dimension của line, cách hoạt động như sau :

    1/ Chọn các dimension cần sắp xếp theo 1 phương lần 1 (dimension có thể là aligndimension hay rotateddimension), nó sẽ tự kiểm tra xem các đối tượng này có cùng loại dimension và cùng phương hay không (có thể theo phương bất kỳ)

    2/ Chọn các dimension cần sắp xếp theo 1 phương lần 2 --> kiểm tra như lần 1

     

    Tiện ích này sẽ tự sắp xếp các dimension được chọn ở lần 1 theo cùng 1 phương (xem bản vẽ đính kèm), sau đó sẽ sắp xếp các dimension được chọn ở lần 2 theo cùng 1 phương cách các dimension lần 1 1 khoảng cố định.

     

    Khi viết đến đoạn canh các đường dóng của dimension chọn lần 1 thì tôi gặp phải 1 vấn đề sau : Làm sao lấy được kích thước thật của dimension (khoảng cách thật trên bản vẽ chứ không phải là kích thước sau khi đã nhân với tỷ lệ của dimstyle) (mã dxf của kích thước sau khi nhân với tỷ lệ của dimstyle là 42)

     

    BV va file lisp

     

    Xin cảm ơn.


  9. Hiện tôi đang cần lisp tạo các point với tọa độ x,y lấy từ tọa độ điểm x của đối tượng proxy, giá trị z lấy từ số bên phải của đối tượng proxy.

    Đây là bản vẽ kèm theo Point.dwg

    Nếu các bác không thấy được các đối tượng proxy thì trong autocad vào tools\options\open and save, ở mục ObjectARX Applications\ proxy images for custom objects, chọn mục show proxy graphics.

    Xin cảm ơn các bác rất nhiều !


  10. Trong file bình đồ có nhiều đối tượng, trong đó có các text cao độ (tọa độ của text là 2d), tôi đang cần 1 tiện ích chọn các text cao độ, tiện ích sẽ tạo ra các đối tượng point 3d (có tọa độ x và y là tọa độ của insertpoint của text và tọa độ z là giá trị của text cao độ).

    Xin cảm ơn các bác.

×