Всех приветствую.
Имеется вот такие две части кода
Dim lxDesign As ResultBuffer = LispExtensions.GetLispSym("lxDesign")
Dim lxDesignDate As ResultBuffer = LispExtensions.GetLispSym("lxDesignDate")
Dim lxChecking As ResultBuffer = LispExtensions.GetLispSym("lxChecking")
Dim lxCheckingDate As ResultBuffer = LispExtensions.GetLispSym("lxCheckingDate")
Dim lxArray As Array
Dim lxString As String
lxArray = lxDesign.AsArray
lxString = lxArray(0).value
TB_11.Text = lxString
lxArray = lxDesignDate.AsArray
lxString = lxArray(0).value
TB_21.Text = lxString
lxArray = lxChecking.AsArray
lxString = lxArray(0).value
TB_12.Text = lxString
lxArray = lxCheckingDate.AsArray
lxString = lxArray(0).value
TB_22.Text = lxString
Это части кода, который создаёт окно. Логика работы такая - при инициализации берутся переменные лиспа, есть они или нет в чертеже. Потом заполняются или редактируются поля, считываются и отправляются обратно в переменные лиспа. Мне интересно, возможно ли записать данные примеры циклом, чтобы было меньше строк. В автолиспе я делал это через (eval (read variable)). В VB.NET не могу найти информацию и не хватает опыта.
Конструкция типа:
Dim lxStringCollection = New String() {"lxDesign", "lxDesignDate", "lxChecking", "lxCheckingDate"}
Dim lxTBCollection = New String() {"TB_11", "TB_21", "TB_12", "TB_22"}
For lxItem = 0 To lxStringCollection.GetUpperBound(0)
lxResultBuffer.Add(LispExtensions.GetLispSym(lxItem))
Next
Dim lxIndex = 0
For Each lxBuffer As TypedValue In lxResultBuffer
Dim lxStringBuffer As String = lxTBCollection(lxIndex) & ".text = lxBuffer.Value"
Dim lxTable = New System.Data.DataTable()
Convert.ToDouble(lxTable.Compute(lxStringBuffer, Nothing))
lxIndex += 1
Next
Вылетает с критической ошибкой AutoCAD.
И второй вопрос.
Первый вариант окна я делал с помощью класса, написанного Александром Ривилисом
https://forums.autodesk.com/t5/net/acedgetsym-and-acedputsym-in-net-applications/td-p/1635754 и переработанного для VB.net
https://www.theswamp.org/index.php?topic=35714.0. Но изучая хелп по API .NET я наткнулся на тот факт, что в API реализованы данные методы. Нашёл пример использования этих методов на C#
https://adndevblog.typepad.com/autocad/2014/08/set-or-get-lisp-symbol-in-net.html. И метод Set* работал отлично, но метод Get* не хотел работать, при отладке выдавало исключение, если в переменной находилось значение String. Изначально я неправильно переписал код с C# на VB.NET. Когда я точно повторил пример на сайте, то уже выдавало не просто исключение, а указывало на то, что объект String не может быть сконвертирован в TypedValue.
Я решил проблему двумя способами:
Dim lxDesign As Object = lxDocument.GetLispSymbol("lxDesignPE4")
If Not String.IsNullOrEmpty(lxDesign) Then
TB_11.Text = lxDesign.ToString
End If
Dim lxDesign = New TypedValue(CInt(LispDataType.Text), lxDocument.GetLispSymbol("lxDesignPE4"))
TB_11.Text = lxDesign.Value
И если кто может объяснить чем эти способы различаются и могут повлиять на AutoCAD. Либо они равнозначны и можно делать как удобно.
PS Прошу особо не пинать за, может быть, глупые и непонятные вопросы, изучаю AutoLISP с лета этого года, а VB.NET пару недель.