Однотипные строки в цикл

Автор Тема: Однотипные строки в цикл  (Прочитано 15264 раз)

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

Оффлайн LemieuxАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 384
  • Карма: 21
Re: Однотипные строки в цикл
« Ответ #15 : 23-10-2019, 11:37:15 »
Вообще-то ResultBuffer.Add работает с TypedValue, а не с ResultBuffer. В этом может быть ошибка.
Александр, я пробовал добавлять с помощью Typedvalue, но всё равно AutoCAD крашится.

Это потому, что, несмотря на использование .NET, Вы продолжаете думать на LISP. То есть, Вы совершенно игнорируете новые возможности и пытаетесь адаптировать .NET под логику LISP. Разумеется, что ничего хорошего из этого не выйдет.
Дмитрий, я знаю про словари, но у меня стринговые переменные, например "lxDesign", не только читаются из чертежа, но и потом присваиваются обратно, о чём я писал в начале. Я может не понимаю Вашей мысли, Вы не могли написать пример на C#. Да и вряд ли краш AutoCAD связан с тем, что я пишу так как в начальном примере, а не с помощью словаря.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Однотипные строки в цикл
« Ответ #16 : 23-10-2019, 11:44:51 »
Lemieux,
Цитата: Александр Ривилис от 22-10-2019, 22:39:17

    А если вместо LispExtensions.GetLispSym() используешь lxDocument.GetLispSymbol(...) ?

Это я уже завтра потестирую
И? Какой результат?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Однотипные строки в цикл
« Ответ #17 : 23-10-2019, 11:48:22 »
Александр, я пробовал добавлять с помощью Typedvalue, но всё равно AutoCAD крашится.
Каким образом? Я не вижу кода, которым вы это делаете и поэтому не могу проверить. Создайте специальный тестовый проект, в котором будете только читать и писать lisp-переменные. Я его протестирую.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн LemieuxАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 384
  • Карма: 21
Re: Однотипные строки в цикл
« Ответ #18 : 23-10-2019, 11:58:05 »
И? Какой результат?
Я пока что на работе, когда дома буду, то выложу все результаты.

Каким образом? Я не вижу кода, которым вы это делаете и поэтому не могу проверить. Создайте специальный тестовый проект, в котором будете только читать и писать lisp-переменные. Я его протестирую.
Делал примерно так
Код - vb.net [Выбрать]
  1. lxResultBuffer.Add(New TypedValue(CInt(LispDataType.Text), (LispExtensions.GetLispSym(lxStringCollection(lxItem))))

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Однотипные строки в цикл
« Ответ #19 : 23-10-2019, 12:27:02 »
Делал примерно так
Код - vb.net [Выбрать]

    lxResultBuffer.Add(New TypedValue(CInt(LispDataType.Text), (LispExtensions.GetLispSym(lxStringCollection(lxItem))))
Очевидно, что это ерунда. TypedValue - это один из элементов в ResultBuffer
Соответственно, должно было быть что-то типа:
Код - vb.net [Выбрать]
  1. For Each tv As TypedValue In LispExtensions.GetLispSym(lxStringCollection(lxItem)))
  2.  lxResultBuffer.Add(tv)
  3. Next

P.S.: Настоятельно рекомендую заняться изучением C# и забросить VB.NET
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Однотипные строки в цикл
« Ответ #20 : 23-10-2019, 12:34:25 »
Я может не понимаю Вашей мысли, Вы не могли написать пример на C#.
Код - C# [Выбрать]
  1. Dictionary<string, TextBox> varAndBoxesDict
  2.     = new Dictionary<string, TextBox>
  3.     {
  4.         { "lxDesign", TB_11 },
  5.         { "lxDesignDate", TB_21 },
  6.         { "lxChecking", TB_12 },
  7.         { "lxCheckingDate", TB_22 },
  8.     };
  9.  
  10.  
  11. // Переносим значения из переменных в текстбоксы
  12. foreach (KeyValuePair<string, TextBox> pair in varAndBoxesDict)
  13. {                
  14.     string text =
  15.         // Вспомогательный метод, который вытаскивает строку, сохранённую в LISP-переменной
  16.         LispExtensions.GetTextFromLispVariable(pair.Key);
  17.     pair.Value.Text = text ?? string.Empty;
  18. }
  19.  
  20. // Переносим значения из текстбоксов в переменные
  21. foreach (KeyValuePair<string, TextBox> pair in varAndBoxesDict)
  22. {
  23.     string text = pair.Value.Text?.Trim() ?? string.Empty;
  24.     // Вспомогательный метод, который записывает строку в LISP-переменную
  25.     LispExtensions.SetLispSym(pair.Key, text);
  26. }
  27.  
Да и вряд ли краш AutoCAD связан с тем, что я пишу так как в начальном примере, а не с помощью словаря.
Возможно. Я неправильно выразился. Я имел в виду, что такие сложные действия в коде являются следствием попытки реализовать операции через одно место через логику LISPа :)

Оффлайн LemieuxАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 384
  • Карма: 21
Re: Однотипные строки в цикл
« Ответ #21 : 23-10-2019, 12:50:39 »
P.S.: Настоятельно рекомендую заняться изучением C# и забросить VB.NET
Я последую Вашему совету и следующую работу выполню на C#

Я имел в виду, что такие сложные действия в коде являются следствием попытки реализовать операции через одно место через логику LISPа
Согласен, что через логику лиспа, но мне интересны различные варианты реализации, для этого я и создал эту тему. Но, к сожалению, я обычно сначала выполняю практические занятия и провожу разные эксперименты, а уже потом читаю книги. У меня была задача написать скрипты для автоматической формирований связей между элементами схемы, автоматического формирования остальных документов из схемы Э4. Я сделал, времени читать книги не было, разбираюсь на ходу.
Спасибо за пример.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Однотипные строки в цикл
« Ответ #22 : 23-10-2019, 13:01:12 »
Но, к сожалению, я обычно сначала выполняю практические занятия и провожу разные эксперименты, а уже потом читаю книги. У меня была задача написать скрипты для автоматической формирований связей между элементами схемы, автоматического формирования остальных документов из схемы Э4. Я сделал, времени читать книги не было, разбираюсь на ходу.
Да это, в общем-то, вполне нормальный подход: практика + теория. Главное - не пренебрегать чем-то одним. Читать книги обязательно надо, применять полученные знания на практике тоже очень важно. То, что задаёте вопросы - вообще отлично! Многие почему-то стесняются. Ну и готовьтесь к тому, что всё что вы сейчас напишете через год-два либо выкинете, либо будете переписывать заново ;)

Оффлайн LemieuxАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 384
  • Карма: 21
Re: Однотипные строки в цикл
« Ответ #23 : 23-10-2019, 13:07:51 »
Ну и готовьтесь к тому, что всё что вы сейчас напишете через год-два либо выкинете, либо будете переписывать заново
Так я к этому давно привык, ещё во времена, когда писал на Python и Mel интерфейсы и конвертеры шейдеров в Maya. Даже сейчас, за эти месяцы изучения и практики я нахожу более практичные реализации задач и, просматривая старый код, думаю - "Неправильно я написал, надо было делать по другому." Вообще у меня был такой план. Я пишу дополнение на лисп для создания КД шкафов РЗА, потом изучаю .NET и пишу дополнение для создания КД шкафов НКУ. Но плохое поведение DCL меня поставило в такие условия, что раньше пришлось начать изучение .NET. VB.NET я выбрал только из-за того, что у меня были видео уроки по созданию плагинов для AutoCAD на VB.NET.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Однотипные строки в цикл
« Ответ #24 : 23-10-2019, 13:08:16 »
Но, к сожалению, я обычно сначала выполняю практические занятия и провожу разные эксперименты, а уже потом читаю книги.
Эти эксперименты могут отнять много времени, которое можно было потратить на что-то другое более полезное. Впрочем ваше дело...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Однотипные строки в цикл
« Ответ #25 : 23-10-2019, 13:09:40 »
VB.NET я выбрал только из-за того, что у меня были видео уроки по созданию плагинов для AutoCAD на VB.NET.
Там же были уроки по созданию плагинов на C# для AutoCAD. На каком-то из C-подобных языков вы уже что-то писали?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Однотипные строки в цикл
« Ответ #26 : 23-10-2019, 13:26:11 »
Но плохое поведение DCL меня поставило в такие условия, что раньше пришлось начать изучение .NET.
Так-так-так... Теперь понятны попытки скрестить лисп с нетом. То есть, нужен диалог для изменения каких-то лисповых данных? А есть уверенность, что подход выбран правильный? Я про то, что данные можно передавать по другому - не через считывание-запись лисповых переменных, а с помощью передачи аргументов в самописную лисп-функцию, которая после завершения диалога будет возвращать полученные в нём значения.
Типа такого:
Код - Auto/Visual Lisp [Выбрать]
  1. (setq
  2.         res (run-my-dialog lxDesign lxDesignDate lxChecking lxCheckingDate)
  3.         lxDesign (nth 0 res)
  4.         lxDesignDate (nth 1 res)
  5.         lxChecking (nth 2 res)
  6.         lxCheckingDate (nth 3 res)
  7. )
Функцию run-my-dialog написать на .NET. Она будет принимать строковые значения, запускать диалог по их изменению и возвращать список новых значений после закрытия диалога.
P.S.: Настоятельно рекомендую заняться изучением C# и забросить VB.NET
+1

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Однотипные строки в цикл
« Ответ #27 : 23-10-2019, 13:28:52 »
Функцию run-my-dialog написать на .NET. Она будет принимать строковые значения, запускать диалог по их изменению и возвращать список новых значений после закрытия диалога.
Именно так. Или всё полностью пишется на .NET (C#/VB.NET) или на .NET пишется функции, к которым обращаются из lisp.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн LemieuxАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 384
  • Карма: 21
Re: Однотипные строки в цикл
« Ответ #28 : 23-10-2019, 13:45:48 »
На каком-то из C-подобных языков вы уже что-то писали?
Нет

Но плохое поведение DCL меня поставило в такие условия, что раньше пришлось начать изучение .NET.
Так-так-так... Теперь понятны попытки скрестить лисп с нетом. То есть, нужен диалог для изменения каких-то лисповых данных? А есть уверенность, что подход выбран правильный? Я про то, что данные можно передавать по другому - не через считывание-запись лисповых переменных, а с помощью передачи аргументов в самописную лисп-функцию, которая после завершения диалога будет возвращать полученные в нём значения.
Типа такого:
Код - Auto/Visual Lisp [Выбрать]
  1. (setq
  2.         res (run-my-dialog lxDesign lxDesignDate lxChecking lxCheckingDate)
  3.         lxDesign (nth 0 res)
  4.         lxDesignDate (nth 1 res)
  5.         lxChecking (nth 2 res)
  6.         lxCheckingDate (nth 3 res)
  7. )
Функцию run-my-dialog написать на .NET. Она будет принимать строковые значения, запускать диалог по их изменению и возвращать список новых значений после закрытия диалога.
P.S.: Настоятельно рекомендую заняться изучением C# и забросить VB.NET
+1
Я думал о таком подходе, чтобы написать функцию лиспа на .net. Но когда вызываешь модальное окно с помощью функции лиспа, то AutoACD крашится.
То есть я делал конструкцию типа:
Код - vb.net [Выбрать]
  1. <LispFunction("Window")>
  2. //тут инициализовал окно
и AutoCAD вылетал.

Работает всё это только из команды:
Код - vb.net [Выбрать]
  1. <CommandMethod("Window")>
  2. //тут инициализовал окно

Или всё полностью пишется на .NET (C#/VB.NET) или на .NET пишется функции, к которым обращаются из lisp.
Согласен, но пришлось прибегнуть к такому способу, так как чтобы переписать весь код на .net уйдёт слишком много времени.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Однотипные строки в цикл
« Ответ #29 : 23-10-2019, 13:54:59 »
Я думал о таком подходе, чтобы написать функцию лиспа на .net. Но когда вызываешь модальное окно с помощью функции лиспа, то AutoACD крашится.
То есть я делал конструкцию типа:
Код - vb.net [Выбрать]
  1. <LispFunction("Window")>
  2. //тут инициализовал окно
и AutoCAD вылетал.
Причина, видимо, была где-то внутри того, что скрывается под "//тут инициализовал окно". Из лисп-функции нормально запускаются модальные диалоги.