| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > .NET Как найти блок находящийся на линии

.NET Как найти блок находящийся на линии

Ответ
Поиск в этой теме
Непрочитано 09.05.2011, 13:22 #1
.NET Как найти блок находящийся на линии
Алексей Нис
 
Регистрация: 09.05.2011
Сообщений: 4

Подскажите пожалуйста куда копать. Нужно найти блок, находящийся на линии или около нее.
Просмотров: 1569
 
Непрочитано 10.05.2011, 10:11
#2
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Цитата:
Сообщение от Алексей Нис Посмотреть сообщение
Подскажите пожалуйста куда копать. Нужно найти блок, находящийся на линии или около нее.
Попробуй должно работать и с полилинией и тд
Код:
[Выделить все]
 (defun C:demo(/ acapp  acsp adoc axss  blklist  blockname bss dis ent gap ipt pline pt ss sub_list )
(vl-load-com)
(setq acsp (vla-get-block
	     (vla-get-activelayout
	       (setq adoc (vla-get-activedocument
			    (setq acapp (vlax-get-acad-object)))))
	     )
      )
(setq blockname (getstring t "\n\tBlock name: "))
(if (not
      (setq ent (entsel "\nSelect pline >> ")))
  (exit))
(vl-cmdf "_zoom" "_o" (car ent) "")
(initget 6)
(setq dis (getdist
	    "\nEnter minimal distance between polyline and insertion point of block <0.1>: "))
(if (not dis)
  (setq dis 0.1))
(setq pline (vlax-ename->vla-object (car ent)))
(if (not
      (setq ss (ssget "_x"
		      (list (cons 0 "insert")
			    (cons 2 (strcat "`*U*," blockname))
			    (cons 410 (getvar "ctab"))))))
  (exit))
(setq axss (vla-get-activeselectionset adoc))
(princ (strcat "\n\tSelected: "
	       (itoa (sslength ss))" blocks ""\"" blockname "\""))
(vlax-for obj  axss
  (if (eq (strcat (vla-get-effectivename obj)) (strcat blockname))
    (progn
      (setq pt (vlax-get obj 'insertionpoint))
      (setq gap	(- (distance pt (vlax-curve-getclosestpointto pline pt))
		   dis))
      
      (if (< gap 0.0001)
	(setq blklist (cons obj blklist)))
      )))
(setq bss (ssadd))
(mapcar	'(lambda (x) (ssadd (vlax-vla-object->ename x) bss))
	blklist)
  (vl-cmdf "_zoom" "_p")
(sssetfirst bss bss)
(princ (strcat "\n\tDetected: "
	       (itoa (sslength bss))" blocks ""\"" blockname "\""))
(princ)
  )
Или так

Код:
[Выделить все]
   <CommandMethod("interb", CommandFlags.UsePickSet And CommandFlags.Modal)> _
        Public Sub demo()
            Dim doc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
            Dim db As Database = doc.Database
            Dim ed As Editor = doc.Editor
            Const fuzz As Double = 0.0001 '<--precision
            Dim selIds As New ObjectIdCollection
            Try
                Dim tab As String = Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("ctab").ToString
                Dim blockname As String = ed.GetString(vbLf & "Enter blockname: ").StringResult

                Dim filt As SelectionFilter = New SelectionFilter({New TypedValue(0, "insert"), New TypedValue(2, blockname), New TypedValue(410, tab)})
                Dim psr As PromptSelectionResult = ed.SelectAll(filt)
                If psr.Status = PromptStatus.OK Then
                    ed.WriteMessage(vbLf & "Selected {0} blocks", psr.Value.Count)

                    If psr.Value.Count = 0 Then Exit Sub
                    Dim dis As Double = ed.GetDistance(vbLf & "Enter minimal distance to examine blocks : ").Value

                    Using tr As Transaction = db.TransactionManager.StartTransaction()
                        Dim entId As ObjectId = ed.GetEntity(vbLf & "Select curve : ").ObjectId
                        Dim curv As Curve = CType(tr.GetObject(entId, OpenMode.ForRead), Curve)
                        For Each itemId As ObjectId In psr.Value.GetObjectIds()

                            Dim obj As DBObject = tr.GetObject(itemId, OpenMode.ForRead)

                            If TypeOf obj Is BlockReference Then

                                Dim bref As BlockReference = CType(tr.GetObject(itemId, OpenMode.ForRead), BlockReference)
                                Dim p As Point3d = bref.Position
                                Dim cp As Point3d = curv.GetClosestPointTo(p, False)
                                Dim gap As Double = cp.DistanceTo(p)
                                If gap - dis < fuzz * 2 Then
                                    selIds.Add(itemId)
                                End If

                            End If

                        Next
                    End Using
                End If

                ed.WriteMessage(vbLf & "Detected {0} blocks ""{1}""", selIds.Count, blockname)
            Catch ex As Autodesk.AutoCAD.Runtime.Exception
                ed.WriteMessage(ex.Message + vbLf + ex.StackTrace)
                Return
            End Try
        End Sub

Последний раз редактировалось Олег (jr.), 10.05.2011 в 12:38.
Олег (jr.) вне форума  
 
Непрочитано 10.05.2011, 11:39
#3
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


А какое отношение это имеет к слову .Net (заголовок).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 10.05.2011, 15:28
#4
Алексей Нис


 
Регистрация: 09.05.2011
Сообщений: 4


Дима, .NET в заголовке символизирует, что мне нужно было выполнить это в коде фреймворка.
Олег, огромное спасибо за ответ. Сегодня я выходной, а завтра попробую.
Алексей Нис вне форума  
 
Автор темы   Непрочитано 12.05.2011, 15:49
#5
Алексей Нис


 
Регистрация: 09.05.2011
Сообщений: 4


Олег (jr.)! Спасибо огромное - это было именно то, что нужно.
Дима_, .Net в заголовке - это потому, что решение нужно именно в этой среде. Причем, не важно на каком языке. Если я правильно понял предложения по оформлению заголовков, то там сказано:
Цитата:
Предлагаю в самом начале наименования топиков сначала указывать язык программирования, которым пользуется автор в решении вопроса, суть которого изложена в теле топика, а так же версию AutoCAD, для которой пишется решение.

Последний раз редактировалось Алексей Нис, 13.05.2011 в 19:24.
Алексей Нис вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > .NET Как найти блок находящийся на линии

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание нового типа линий Apelsinov AutoCAD 915 08.07.2022 12:36
Хитрый блок Vova Динамические блоки 166 20.03.2017 15:13
Как найти блок по атрибуту? Klo Динамические блоки 3 14.10.2010 19:06
помогите найти динамический блок N84 Разное 5 20.10.2008 10:25
Нужен такой вот блок AGEL Программирование 6 31.10.2003 11:18