Последние сообщения

Последние сообщения

Страницы: [1] 2 3 ... 10
1
VBA / Re: удалить блок из набора/выбора блоков
« Последний ответ от wavaw 29-04-2017, 23:58:23 »
Александр Ривилис,
тогда вместе с элементом самого блока удаляется и привязанный к нему объект с чертежа
Код - Visual Basic [Выбрать]
  1. ThisDrawing.SelectionSets("SS").Delete
  2.     Set ss = ThisDrawing.SelectionSets.Add("SS")
  3.     ss.SelectOnScreen
  4.    
  5.     i = 0
  6.     For Each objEnt In ss
  7.         ReDim Preserve arr(i)
  8.         Set arr(i) = objEnt
  9.         Set b = objEnt
  10.         i = i + 1
  11.     Next
  12.    
  13.     i = 0
  14.     For i = LBound(arr) To UBound(arr)
  15.         If arr(i).Layer <> "Vramka" Then
  16.             arr(i).Delete 'удаляет элемент с чертежа
  17.            arr(i).RemoveItems 'ничего не происходит (такого метода в массива вроде бы и нет)
  18.            ss.RemoveItems arr(i) 'ничего не происходит
  19.        End If
  20.     Next
2
Вопрос с именем блока снимается, т.к. можно просто это имя ему задать "вручную" =)
Но хотелось бы получить разъяснения по работе последнего метода
3
Итак, как я и говорил в топике - Мне кажется, что решаться это должно просто - так оно и есть - решение простое. Но без проблем не обходится.
В методах Database уже есть метод для вставки чертежа как блока. Из трех вариантов я рассматриваю два. Первый из которых работает нормально:
Код - C# [Выбрать]
  1. public ObjectId Insert(
  2.     string blockName,
  3.     Database dataBase,
  4.     [MarshalAs(UnmanagedType.U1)] bool preserveSourceDatabase
  5. );
Указанный блок вставляется в текущий файл, но у него нет имени. В рамках моего проекта этот вариант не подходит, поэтому я решил использовать второй вариант:
Код - C# [Выбрать]
  1. public ObjectId Insert(
  2.     string sourceBlockName,
  3.     string destinationBlockName,
  4.     Database dataBase,
  5.     [MarshalAs(UnmanagedType.U1)] bool preserveSourceDatabase
  6. );
Читаю справку:
Цитировать
This function creates a new block table record in the database executing this function. This new block table record is given the name pointed to by destinationBlockName. Then, each entity in the block table record whose name is sourceBlockName and which resides in the database pointed to by dataBase is copied into the new block table record.
И понимаю, что со специфическим английским у меня туговато  :D
В общем, если в параметр destinationBlockName я передаю имя файла (без расширения), то получаю ошибку eKeyNotFound. Мне кажется, что я не совсем правильно понимаю как этот метод должен использоваться
4
вы скорее всё же правы. не выходит удалить эти элементы набора.
Всё проще. Нужно создать массив удаляемых элементов, заполнить его в цикле по элементам набора, а затем в цикле по элементам массива удалять их из набора.
5
VBA / Re: удалить блок из набора/выбора блоков
« Последний ответ от wavaw 29-04-2017, 08:03:13 »
Александр Ривилис,

вы скорее всё же правы. не выходит удалить эти элементы набора.
придётся пользоваться "костылём" и выделять заведомо только нужные блоки-рамки. тогда работает как надо.
6
Насколько я помню в цикле по набору нельзя удалять элементы набора.
7
VBA / Re: удалить блок из набора/выбора блоков
« Последний ответ от Алексей Кулик 28-04-2017, 22:10:08 »
Я просто показал, как из набора можно "убрать" объект, отвечающий определенным требованиями. Сугубо ИМХО: тебе надо проверять именно эффективное имя блока.
Кстати, строкаIf ent.ObjectName = "AcDbBlockReference" Thenпо идее лишняя - в набор и так попадают только блоки. Советую пошагово пройти по коду и посмотреть, что и когда появляется и исчезает из набора. Я убежден, что в наборе сначала есть все, но последующая операция selset.RemoveItem убирает как лишнее, так и нужное. Меняй критерии убирания объектов из набора.
8
VBA / Re: удалить блок из набора/выбора блоков
« Последний ответ от wavaw 28-04-2017, 21:26:03 »
Алексей Кулик,
не удаётся проверить правильность. vba просто игнорит присвоение фильтра


Код - Visual Basic [Выбрать]
  1. ' 3. Batch printing of specific blocks-formats
  2. Sub PlotByBlocks()
  3.  
  4. '    Dim objEnt As AcadEntity
  5.    Dim objBRef As AcadBlockReference
  6.     Dim pt1 As Variant
  7.     Dim pt2(0 To 1) As Double
  8.     Dim i As Integer
  9.  
  10.     ' Create a selection with a frame
  11.    
  12.     On Error Resume Next
  13. Dim ent As AcadEntity
  14. Dim selset As AcadSelectionSet
  15. Dim ssName As String
  16. Dim filterData As Variant, filterType As Variant
  17.   ssName = "adncis"
  18.   On Error Resume Next
  19.   ThisDrawing.SelectionSets.Item(ssName).Delete
  20.  
  21.   filterType(0) = 0
  22.   filterData(0) = "INSERT"
  23.   i = i + 1
  24.  
  25.   Set selset = ThisDrawing.SelectionSets.Add(ssName)
  26.   selset.SelectOnScreen filterType, filterData
  27.    
  28.   For Each ent In selset
  29.     If Left(ent.Name, 2) = "*U" Then
  30.       selset.RemoveItems ent
  31.     End If
  32.   Next
  33.  
  34.     'ThisDrawing.SelectionSets("SS").Delete
  35.    'Set ss = ThisDrawing.SelectionSets.Add("SS")
  36.    'ss.SelectOnScreen
  37.        
  38.     ' We work if the name of the A1 block
  39.    i = 0
  40.     For Each ent In selset
  41.     If ent.ObjectName = "AcDbBlockReference" Then
  42.     Set objBRef = ent
  43.     BlockProp = objBRef.GetDynamicBlockProperties
  44.         If objBRef.EffectiveName = "Mega Ramka" And BlockProp(4).Value = "A3-a" And Left(objBRef.EffectiveName, 2) <> "*U" Then
  45.             pt1 = objBRef.InsertionPoint
  46.             pt1 = ThisDrawing.Utility.TranslateCoordinates(pt1, acWorld, acDisplayDCS, False)
  47.             ReDim Preserve pt1(0 To 1)
  48.             pt2(0) = pt1(0) + 42000
  49.             pt2(1) = pt1(1) + 29700
  50.             i = i + 1
  51.             PolyPlot "c:\Users\wavaw\Desktop\À3_" + CStr(i), pt1, pt2
  52.         End If
  53.     End If
  54.     Next
  55.    
  56. End Sub
  57. Sub PolyPlot(strFileName As String, pt1 As Variant, pt2 As Variant)
  58.  
  59.     ' We declare
  60.    Dim Layout As AcadLayout
  61.          
  62.     ' Setting
  63.    Set Layout = ThisDrawing.ActiveLayout
  64.        
  65.     Layout.RefreshPlotDeviceInfo
  66.            
  67.     ' Print Settings
  68.    Layout.ConfigName = "DWG to PDF.pc3"
  69.     Layout.CanonicalMediaName = "ISO_full_bleed_A3_(420.00_x_297.00_MM)"
  70.     Layout.CenterPlot = True
  71.     Layout.PlotRotation = ac0degrees
  72.     Layout.StandardScale = acScaleToFit
  73.     Layout.StyleSheet = "monochrome.ctb"
  74.    
  75.     ' We set the frame and type of window
  76.    Layout.SetWindowToPlot pt1, pt2
  77.     Layout.PlotType = acWindow
  78.    
  79.     ' We send to the press
  80.    ThisDrawing.Regen acAllViewports
  81.     ThisDrawing.Plot.PlotToFile strFileName
  82.        
  83. End Sub
9
Например, _.-insert (динамическая вставка блока, блок "болтается" на курсоре). Или _.change (аналогичные условия).
Если для _.-insert в принципе можно получить последний примитив, после выполнения посмотреть, что изменилось - в общем, выкрутиться, то для _.change начинается уже значительно более мозголомная логика. Похоже, придется переписывать часть библиотечных функций :(
Печально...
10
Revit API / Re: Расчетный параметр в спецификации Revit
« Последний ответ от shss 28-04-2017, 18:45:46 »
Думаю, что обычным перебором ячеек таблицы сработает:

Код - C# [Выбрать]
  1. viewSchedule = RevitUtils.createTemporarySchedule(doc, activeSchedule as ViewSchedule);
  2. var body = viewSchedule.GetTableData().GetSectionData(SectionType.Body);
  3. var cNumberBody = body.NumberOfColumns;
  4. var rNumberBody = body.NumberOfRows;
  5. for (int r = 0; r < rNumberBody; r++) {
  6.     for (int c = 0; c < cNumberBody; c++) {
  7.         string value = viewSchedule.GetCellText(SectionType.Body, r, c);
  8.     }
  9. }
  10.  

На крайний случай, можно экспортировать спецификацию в TXT и получить нужное значение:
Код - C# [Выбрать]
  1. viewSchedule.Export(filePath, selectedScheduleName + ".txt", new ViewScheduleExportOptions());
Вот тут, подробнее: http://thebuildingcoder.typepad.com/blog/2012/05/the-schedule-api-and-access-to-schedule-data.html
Страницы: [1] 2 3 ... 10