Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
5 replies to this topic

#1 ngdongit

ngdongit

    Chưa sử dụng CAD

  • Members
  • Pip
  • 1 Bài viết
Điểm đánh giá: -1 (bình thường)

Đã gửi 04 April 2015 - 10:11 AM

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 đỡ.


  • -1

#2 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 06 April 2015 - 12:16 AM

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.


  • 0

#3 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1431 Bài viết
Điểm đánh giá: 1425 (rất tốt)

Đã gửi 06 April 2015 - 09:21 AM

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)


  • 0

#4 quansla

quansla

    biết lệnh xclip

  • Members
  • PipPipPipPipPipPipPip
  • 641 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 06 April 2015 - 03:04 PM

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ỏ
  • 0

#5 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 07 April 2015 - 01:07 AM

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


  • 0

#6 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 24 April 2015 - 09:17 AM

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.


  • 0
Clear sky!

MF Rock collection.