Суммирование по условию

Автор Тема: Суммирование по условию  (Прочитано 4030 раз)

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

Оффлайн Дмитрий_DimAsАвтор темы

  • ADN OPEN
  • Сообщений: 4
  • Карма: 0
Суммирование по условию
« : 17-01-2020, 12:05:26 »
Всем доброго дня! Пытаюсь просуммировать, с выводом в таблицу, длины кабелей в зависимости от их жильности. Вид записи всегда такой, пример - 500-3х2, где 500 - длина кабеля, а  3х2 соответственно жильность кабеля, в качестве разделителя "-". По задумке, я жму кнопку(привязанную к макросу) на панели появляется предложение выбора объектов и дальше идёт обработка кодом. Есть часть решения на VBA в Excel, а именно нахождение одинаковых кабелей и суммирование их, решение реализовано с помощью Dictionary. По логике, я решил, что и в Акаде это нужно делать по подобию.  В итоге, я упёрся в наполнение словаря объектами, пошагово просматривая код в Locales вижу, что Словарь(в моём коде) остаётся пустым! Прошу помочь с этим вопросом.
Часть решения с выводом результатов на лист в Excel
Код - Visual Basic [Выбрать]
  1. Sub iArr()
  2. Dim i As Integer
  3. Dim dicObj As Object
  4. Dim Arr
  5. ReDim Arr(0 To 3) As String
  6. Arr(0) = "500-1x2"
  7. Arr(1) = "100-1x2"
  8. Arr(2) = "200-7x2"
  9. Arr(3) = "300-7x2"
  10.   Set dicObj = CreateObject("scripting.dictionary")
  11.     For i = LBound(Arr) To UBound(Arr)
  12.       dicObj.Item(Split(Arr(i), "-")(1)) = dicObj.Item(Split(Arr(i), "-")(1)) + CDbl(Split(Arr(i), "-")(0))
  13.     Next
  14.      Range("A1").Resize(dicObj.Count, 2) = Application.Transpose(Array(dicObj.keys, dicObj.Items))
  15. End Sub

Это мои попытки в Акаде:
Код - Visual Basic [Выбрать]
  1. Sub Example()
  2. Dim grOb As AcadSelectionSet
  3. ActiveDocument.SelectionSets.Item("SET").Delete
  4. Set grOb = ThisDrawing.SelectionSets.Add("SET")
  5. grOb.SelectOnScreen
  6.  
  7. Dim Arr
  8. ReDim Arr(1 To grOb.Count) As AcadEntity 'создал массив
  9. For j = 1 To grOb.Count
  10. Set Arr(j) = grOb.Item(j) 'заполнил массив данными
  11. Next j
  12.  
  13. Dim z As Integer
  14. Dim dictObj As AcadDictionary
  15. Set dictObj = ThisDrawing.Dictionaries.Add("TEST_DICTIONARY")
  16. For z = LBound(Arr) To UBound(Arr)
  17. Dim customObj As AcadObject
  18. Set customObj = dictObj.AddObject((Split(Arr(z), "-")(1) + CDbl(Split(Arr(z), "-")(0)))) ' в этом месте затык
  19. Next z
  20. End Sub

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Суммирование по условию
« Ответ #1 : 17-01-2020, 12:49:11 »
Дмитрий_DimAs,
Приветствую на форуме!
По логике, я решил, что и в Акаде это нужно делать по подобию.
Не думаю, что это правильный вывод.
В итоге, я упёрся в наполнение словаря объектами, пошагово просматривая код в Locales вижу, что Словарь(в моём коде) остаётся пустым!
О каком словаре идёт речь? AcadDictionary - это совсем не Dictionary в этом смысле: https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/dictionary-object
В AcadDictionary можно добавлять или другой AcadDictionary или XRecord, но не произвольный объект.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий_DimAsАвтор темы

  • ADN OPEN
  • Сообщений: 4
  • Карма: 0
Re: Суммирование по условию
« Ответ #2 : 17-01-2020, 12:53:52 »
Хорошо, а чем тогда можно заменить в Акаде данный приём со словарем? как сортировать объекты, или осуществлять перебор объектов? Я пробовал через If-ы реализовать то, что может словарь, но там совсем не то получается.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Суммирование по условию
« Ответ #3 : 17-01-2020, 13:06:28 »
Хорошо, а чем тогда можно заменить в Акаде данный приём со словарем? как сортировать объекты, или осуществлять перебор объектов? Я пробовал через If-ы реализовать то, что может словарь, но там совсем не то получается.
1. Никто не мешает использовать те же словари, что использовались в VBA для Excel.
2. Найти в интернете алгоритмы сортировки на VBA - в VBA для AutoCAD гтовых нет.
3. Никто не мешает плюнуть на VBA и начать писать на .NET (C#/VB.NET/и т.д.)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий_DimAsАвтор темы

  • ADN OPEN
  • Сообщений: 4
  • Карма: 0
Re: Суммирование по условию
« Ответ #4 : 17-01-2020, 19:07:51 »
Никто не мешает использовать те же словари, что использовались в VBA для Excel.
1.Вы ведь выше написали, что AcadDictionary - это совсем не Dictionary, а теперь предлагаете использовать те же словари!
2. Найти в интернете алгоритмы сортировки на VBA - в VBA для AutoCAD гтовых нет.
2. Я не пойму, это юмор такой? Зачем мне искать решение на VBA, если оно приведено в моём первом сообщении?
3. Никто не мешает плюнуть на VBA и начать писать на .NET (C#/VB.NET/и т.д.)
3. Я потому и написал именно в ветку VBA, потому что не  собираюсь ни на что плевать, и изучать другие языки для решения данной задачи тоже.
Хмм.., сначала вы меня перенаправляете с одного форума на этот, с формулировкой "не понятен вопрос, лучше обратиться сюда",  здесь опять же не даёте ответа, если нечего подсказать, или есть, но не бесплатно - почему не написать прямо.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Суммирование по условию
« Ответ #5 : 17-01-2020, 19:57:17 »
1.Вы ведь выше написали, что AcadDictionary - это совсем не Dictionary, а теперь предлагаете использовать те же словари!
AcadDictionary - это объект внутри dwg-файла. Использовать его для сортировки нельзя. Он совсем для других целей - для хранения информации внутри чертежа.
2. Я не пойму, это юмор такой? Зачем мне искать решение на VBA, если оно приведено в моём первом сообщении?
Так и пользуйтесь им. В чем проблема? В VBA для AutoCAD нет специальных средств для сортировки, о чем я написал выше.

Хмм.., сначала вы меня перенаправляете с одного форума на этот, с формулировкой "не понятен вопрос, лучше обратиться сюда",  здесь опять же не даёте ответа, если нечего подсказать, или есть, но не бесплатно - почему не написать прямо.
1. Вы до сих пор не сформулировали конечную задачу.
2. Если у Вас программа на VBA уже работает, то в чем нужна помощь? В том что AcadDictionary для решения этой задачи не подходит я пишу уже в третий раз.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Суммирование по условию
« Ответ #6 : 17-01-2020, 20:06:28 »
Ну и на всякий случай. В AutoCAD COM/ActiveX таблица - это объект Table (AcadTable): http://help.autodesk.com/view/ACD/2020/ENU/?guid=GUID-7B82400C-53D0-4D1A-94FA-66BB3040F0AA
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий_DimAsАвтор темы

  • ADN OPEN
  • Сообщений: 4
  • Карма: 0
Re: Суммирование по условию
« Ответ #7 : 17-01-2020, 20:33:55 »
Ясно! Значит буду передавать значения в Excel, там сортировать и передавать обратно в Акад(а хотел на стороне родительского приложения реализовать). Про таблицу понял, вопрос исчерпан, спасибо.
« Последнее редактирование: 17-01-2020, 21:06:06 от Дмитрий_DimAs »

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Суммирование по условию
« Ответ #8 : 17-01-2020, 21:04:48 »
Ясно! Значит буду передавать значения в Excel, там сортировать и передавать обратно в Акад(а хотел на стороне родительского приложения реализовать).
Хоть убей не понимаю зачем. Dictionary (https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/dictionary-object) можно использовать и в AutoCAD VBA. Оно к Excel не привязано.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Re: Суммирование по условию
« Ответ #9 : 20-01-2020, 08:18:57 »
Цитировать
потому что не  собираюсь ни на что плевать, и изучать другие языки для решения данной задачи тоже.
И через несколько лет ты поймёшь, что нужно было использовать БД и SQL  ;D