удалить блок из набора/выбора блоков

Автор Тема: удалить блок из набора/выбора блоков  (Прочитано 14204 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
двумя переборами вычленил только то, что мне необходимо "загонять" на печать
Думаю, что при определённой аккуратности хватило бы одного перебора.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн alihovsky

  • ADN OPEN
  • Сообщений: 27
  • Карма: 2
Всё проще. Нужно создать массив удаляемых элементов, заполнить его в цикле по элементам набора, а затем в цикле по элементам массива удалять их из набора.

Здравствуйте. Воспользовался Вашим советом. Да объекты  удаляются из набора в соответствии с назначенным условием ,но в моем случае мне нужно создать два, а в перспективе больше наборов из одного Selectionset -а . И я теперь не могу понять как же разделить наборы, что бы изменения происходили  только с нужным набором.

Задав

Код - Visual Basic [Выбрать]
  1. Set fs_sel_det = fs_sel_all

как  понял я  предопределил, что  наборы  будут меняться оба , если изменить один. Подскажите, если нетрудно, а как же мне оставить первый набор
нетронутым. Создал массив с набором первоначальных объектов, а что с ним делать не могу придумать :'(

 Если на словах объяснять, то мне нужно создать два набора одним выделением(не прибегая к методу Select acSelectionSetAll), так что бы перебирая первый набор вырезать из текущего солида   все взаимодействующие с ним солиды  второго набора 


Код - Visual Basic [Выбрать]
  1. Option Explicit
  2. Public fs_sel_det As AcadSelectionSet
  3. Public fs_sel_all As AcadSelectionSet
  4. Public Sub FS_Lay()
  5. Dim j, w, m, d As Integer
  6.     ThisDrawing.ActiveSpace = acModelSpace
  7. Dim FilterType(0) As Integer
  8. Dim FilterData(0) As Variant
  9.     On Error Resume Next
  10.     ThisDrawing.SelectionSets.Item("ms0").Delete
  11.     ThisDrawing.SelectionSets.Item("ms1").Delete
  12.     Set fs_sel_det = ThisDrawing.SelectionSets.Add("ms0")
  13.     Set fs_sel_all = ThisDrawing.SelectionSets.Add("ms1")
  14.     FilterType(0) = 0
  15.     FilterData(0) = "3DSolid"
  16. Dim groupCode As Variant, dataCode As Variant
  17.     groupCode = FilterType
  18.     dataCode = FilterData
  19.     fs_sel_all.SelectOnScreen groupCode, dataCode
  20.     Set fs_sel_det = fs_sel_all
  21. Dim ini_l,  la_r As String
  22. ReDim sel_obj_all(0 To fs_sel_all.Count - 1) As AcadEntity
  23.     For w = 0 To fs_sel_all.Count - 1
  24.         Set sel_obj_all(w) = fs_sel_all(w)
  25.     Next
  26. ReDim sel_obj_det(0 To fs_sel_det.Count - 1) As AcadEntity
  27.     For w = 0 To fs_sel_det.Count - 1
  28.         Set sel_obj_det(m) = fs_sel_det(m)
  29.         la_r = fs_sel_det(m).Layer
  30.         ini_l = Left(la_r, 1)
  31.             If Not ini_l = "." Then
  32. ReDim sel_obj_del(j) As AcadEntity
  33.                 Set sel_obj_del(j) = sel_obj_det(m)
  34.                 fs_sel_det.RemoveItems sel_obj_del
  35.             End If
  36.     Next
  37. 'Call FS_Lay_act.FS_Lay_act
  38. End Sub


Надеюсь я в ту тему написал или нужно новую создавать?


Спасибо.


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Если на словах объяснять, то мне нужно создать два набора одним выделением(не прибегая к методу Select acSelectionSetAll), так что бы перебирая первый набор вырезать из текущего солида   все взаимодействующие с ним солиды  второго набора
Тебе не нужны вообще наборы. Достаточно одного. Меняй алгоритм.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн alihovsky

  • ADN OPEN
  • Сообщений: 27
  • Карма: 2
Тебе не нужны вообще наборы. Достаточно одного. Меняй алгоритм.

Как всегда Вы абсолютно правы оказались! Все намного проще чем мне казалось

Код - Visual Basic [Выбрать]
  1. Public Sub FS_Lay_act()
  2. Dim j, w As Integer
  3.     For w = 0 To fs_sel.Count - 1
  4.         If Left(fs_sel.Item(w).Layer, 1) = "." Then
  5.             For j = 0 To fs_sel.Count - 1
  6.                 If Left(fs_sel.Item(j).Layer, 1) = "_" Then
  7.                     fs_sel.Item(w).Boolean acSubtraction, fs_sel.Item(j).Copy
  8.                 End If
  9.             Next
  10.         End If
  11.     Next
  12. End Sub
« Последнее редактирование: 29-10-2018, 23:52:47 от alihovsky »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
alihovsky,
Отлично! И обрати внимание, что не следует зацикливаться на наборах AutoCAD. В большинстве случаев они нужны только при запуске AutoCAD'овских команд, требующих наборы. В остальных случая намного удобнее массивы. А в идеале вообще отказ от VBA в пользу .NET (желательно C#, а не VB.NET).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн alihovsky

  • ADN OPEN
  • Сообщений: 27
  • Карма: 2
 Поверьте, мне самому не терпится  на С# перейти, вон вчера посмотрел какой интерфейс замечательный получается  на .net даже у прог  сделанных под автокад, красота, не говоря уж обо всем громадном остальном .... Завязан щас просто сильно на проекте, буквально каждые минуточки дороги