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

Vấn đề ghi nhớ, xóa các line đã chọn và kiểm tra line trùng line

Các bài được khuyến nghị

Chào mọi người,

 

Hiện tại em mới học điều khiển AutoCad bằng C# và ObjectARX. Em có vài vấn đề không biết cách giải quyết.

 

Vấn đề 1: Cách ghi nhớ và xóa các line đã chọn:

 

 Hiện tại cách giải quyết của em là:

 Trường hợp 1: Chỉ chọn một line, em lưu line vào 1 danh sách (List<Line>).

 Trường hợp 2: Chọn polyline, em tách thành từng line và cũng lưu vào danh sách trên.

Nhưng trước khi lưu vào danh sách, em có kiểm tra xem line đã có trong danh sách chưa bằng cách so sánh tọa độ (như dạng x = x, y = y).

Khi xóa line em cũng so sánh tọa độ của các line được chọn với các line trong danh sách đã lưu để tiến hành xóa.

 

Nhưng em thấy cách so sánh tọa độ như vậy không hay, nên em muốn hỏi còn cách nào ghi nhớ, kiểm tra để thêm và kiểm tra để xóa hay hơn không?

Khi em tìm hiểu thì em thấy mỗi đối tượng line đều có một thuộc tính là ObjectId, em không biết có thể dùng thuộc tính này cho những mục đích trên được không? Nhưng nếu dùng thuộc tính này thì nếu như em chọn 1 polyline thì làm sao để lấy objectId của các line thuộc polyline này?

 

Vấn đề 2: Kiểm tra line trùng line

 

Để giải quyết vấn đề này, em đã sử dụng giải thuật kiểm tra 2 điểm của một line có nằm trên line kia hay không.

Nhưng em muốn biết ObjectARX có function nào hỗ trợ việc này hay có cách nào khác để giải quyết hay không?

 

Mong mọi người giúp đỡ.

  • Vote giảm 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Mình kg biết những trả lời của mình có giúp gì cho bạn kg.

Mình tiếp cận arx theo kiểu lisp và các hàm ads (kg biết bạn biết lisp chưa). Mỗi hàm của lisp gần như có hàm ads tương ứng.

Ví dụ về chọn đối tượng lisp có ssget thì ads có ads_ssget , thêm đối tượng ssadd (tương ứng ads_ssadd), xóa có ssdel (ads_ssdel), kiểm tra đối tượng đã có trong tập hợp chọn chưa có ssmemb (ads_ssmemb) ... Như vậy, để chọn, thêm, xóa hay kiểm tra một đối tượng đều được thông qua ename của nó.

Theo như một số bạn thì cách viết này dễ nhưng chậm. Do mình biết lisp đã lâu, lúc đó chỉ có autolisp hơi yếu chứ chưa có viúallisp mạnh như bây giờ nên mình muốn tận dụng một số nguồn lực do ngôn ngữ VC++ và Delphi hỗ trợ như mảng, danh sách và cơ sở dữ liệu ... để xử lý dữ liệu lớn nhưng mình kg phải là dân bài bản nên chỉ làm theo các file mẫu thôi.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Chào mọi người,

 

Hiện tại em mới học điều khiển AutoCad bằng C# và ObjectARX. Em có vài vấn đề không biết cách giải quyết.

 

Vấn đề 1: Cách ghi nhớ và xóa các line đã chọn:

 

 Hiện tại cách giải quyết của em là:

 Trường hợp 1: Chỉ chọn một line, em lưu line vào 1 danh sách (List<Line>).

 Trường hợp 2: Chọn polyline, em tách thành từng line và cũng lưu vào danh sách trên.

Nhưng trước khi lưu vào danh sách, em có kiểm tra xem line đã có trong danh sách chưa bằng cách so sánh tọa độ (như dạng x = x, y = y).

Khi xóa line em cũng so sánh tọa độ của các line được chọn với các line trong danh sách đã lưu để tiến hành xóa.

 

Nhưng em thấy cách so sánh tọa độ như vậy không hay, nên em muốn hỏi còn cách nào ghi nhớ, kiểm tra để thêm và kiểm tra để xóa hay hơn không?

Khi em tìm hiểu thì em thấy mỗi đối tượng line đều có một thuộc tính là ObjectId, em không biết có thể dùng thuộc tính này cho những mục đích trên được không? Nhưng nếu dùng thuộc tính này thì nếu như em chọn 1 polyline thì làm sao để lấy objectId của các line thuộc polyline này?

 

Vấn đề 2: Kiểm tra line trùng line

 

Để giải quyết vấn đề này, em đã sử dụng giải thuật kiểm tra 2 điểm của một line có nằm trên line kia hay không.

Nhưng em muốn biết ObjectARX có function nào hỗ trợ việc này hay có cách nào khác để giải quyết hay không?

 

Mong mọi người giúp đỡ.

- dùng hàm Editor.GetNestedEntity để chọn Line hoặc Arc thuộc Polyline

    (chú ý Polyline cũng có ObjectId của nó)

- ARX không có hàm kiểm tra trực tiếp line trùng line, dùng cách gián tiếp (StartPoint = StartPoint AND EndPoint =EndPoint)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Có bác nào hiện thực hoá yêu cầu 2 của chủ pic theo ngôn ngữ LISP được không (về việc tìm khiếm line,pline trùng nhau), cảm phiền các bấc với, em cũng đang hóng code này

 

 

P/s bài toán có thể đa dạng như: Line trùng LINE, line trùng PolyLINE, line trùng phân đoạn của PolyLINE, line lớn bao line nhỏ, PileLINE lớn bao LINE,PlolyLINE nhỏ

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Yêu cầu 2 mình thấy trên lisp đã bàn rồi, bạn qua đó mà tìm.

Còn trên arx thường ít có mấy hàm làm sẵn như lisp, hoặc có mà mình kg biết hay cad kg công bố. Nếu lập danh sách mà dò thì lâu lắm (khi dữ liệu lớn). Mấy việc dài hơi này phải có ý tưởng rõ ràng, nên sử dụng một lớp của VC++ hỗ trợ hay cơ sở dữ liệu giúp cho việc tìm kiếm nhanh hơn

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Kiểm tra trùng line giữa 2 đường thẳng AB và CD

 

Lúc đó hệ số góc (or góc) của 2 đường trên và đường AC (or DB) phải bằng nhau.

Nếu C nằm trong AB thì chỉ cần kiểm tra 1trong 2 điều kiện xA<=xC<=xB or xB<=xC<=xA

 

Để thuận tiện nhất bạn dùng hàm Atan2(dy,dx) tính ra cũng được.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

×