| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Net: Как через буфер ResultBuffer передать список точек?

Net: Как через буфер ResultBuffer передать список точек?

Ответ
Поиск в этой теме
Непрочитано 26.07.2011, 17:00 #1
Net: Как через буфер ResultBuffer передать список точек?
Павлюкас
 
Москва
Регистрация: 08.10.2007
Сообщений: 42

Не могу понять, как передать список точек

[LispFunction("SearchPoints")]
public void LispSearchPoints(ResultBuffer buf)
{
Array args = buf.AsArray();
SearchPoints((Point3dCollection)(((TypedValue)(args.GetValue(0))).Value));
}

(SearchPoints (list '(0 0 0) '(5 5 5) '(10 10 10)))

выдаёт System.InvalidCastException: Unable to cast object of type
'System.Int32' to type 'Autodesk.AutoCAD.Geometry.Point3dCollection'.
Просмотров: 4392
 
Непрочитано 26.12.2012, 16:44
#2
crosandr

Инженер-строитель
 
Регистрация: 09.07.2010
Санкт-Петербург
Сообщений: 1,988


вопрос решен?
crosandr вне форума  
 
Непрочитано 26.12.2012, 17:19
#3
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от crosandr Посмотреть сообщение
вопрос решен?
некропостер
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 26.12.2012, 17:32
#4
crosandr

Инженер-строитель
 
Регистрация: 09.07.2010
Санкт-Петербург
Сообщений: 1,988


а что делать)
вопрос похожий
crosandr вне форума  
 
Непрочитано 26.12.2012, 17:44
#5
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Попробуй
Код:
[Выделить все]
       [LispFunction("GetPointList")]
        public ResultBuffer PointLispFunction(ResultBuffer args)
        {
            ResultBuffer buff = new ResultBuffer();

            TypedValue[] rbArray = args.AsArray();
         
            buff.Add(new TypedValue((int)LispDataType.ListBegin,null));

            for (int i = 0; i < rbArray.Length - 1; i++)
            {
                object obj = rbArray[i].Value;
                Point3d pnt = (Point3d)obj;
       
                buff.Add(new TypedValue((int)LispDataType.Angle, pnt.X));
                buff.Add(new TypedValue((int)LispDataType.Angle, pnt.Y));
                buff.Add(new TypedValue((int)LispDataType.Angle, pnt.Z));
       
            }
            buff.Add(new TypedValue((int)LispDataType.ListEnd, null));

            return buff;

        }
        //Usage:
        //(GetPointList '(1.0 10.0 0.1) '(2.0 20.0 0.2) '(3.0 30.0 0.3) '(4.0 40.0 0.4) '(5.0 50.0 0.5) )
Олег (jr.) вне форума  
 
Непрочитано 26.12.2012, 17:45
#6
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от crosandr Посмотреть сообщение
а что делать)
вопрос похожий
я подумал, что ты год спустя, решение захотел выложить.
Так а проблема-то в чём? В коде функции поставь брэйкпоинт. Затем, в режиме отладки, из командной строки AutoCAD вызови эту lisp-функцию, передав ей в качестве параметра любой лисповый список точек.
Когда сработает брэйкпоинт - посмотри структуру аргумента ResultBuffer, который был создан автокадом и передан в твою функцию. По увиденной аналогии ты программно можешь воссоздать твой вариант списка точек и возвратить его из функции. Примеры того, как на .net писать LISP функции, передавая им различные параметры и возвращая искомые, можешь глянуть здесь.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 26.12.2012, 17:48
#7
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Если хочешь список субсписков добавь скобки так
Код:
[Выделить все]
      [LispFunction("GetBoundedPointList")]
        public ResultBuffer BoundedPointLispFunction(ResultBuffer args)
        {
            ResultBuffer buff = new ResultBuffer();

            TypedValue[] rbArray = args.AsArray();

            buff.Add(new TypedValue((int)LispDataType.ListBegin, null));

            for (int i = 0; i < rbArray.Length - 1; i++)
            {
                object obj = rbArray[i].Value;
                Point3d pnt = (Point3d)obj;
                buff.Add(new TypedValue((int)LispDataType.ListBegin, null));
                buff.Add(new TypedValue((int)LispDataType.Angle, pnt.X));
                buff.Add(new TypedValue((int)LispDataType.Angle, pnt.Y));
                buff.Add(new TypedValue((int)LispDataType.Angle, pnt.Z));
                buff.Add(new TypedValue((int)LispDataType.ListEnd, null));
            }
            buff.Add(new TypedValue((int)LispDataType.ListEnd, null));

            return buff;

        }
        //Usage:
        //(GetBoundedPointList '(1.0 10.0 0.1) '(2.0 20.0 0.2) '(3.0 30.0 0.3) '(4.0 40.0 0.4) '(5.0 50.0 0.5) )
Олег (jr.) вне форума  
 
Непрочитано 26.12.2012, 18:13
#8
crosandr

Инженер-строитель
 
Регистрация: 09.07.2010
Санкт-Петербург
Сообщений: 1,988


Цитата:
Сообщение от hwd Посмотреть сообщение
Так а проблема-то в чём?
Немножко не по теме поста, но все же.
Если нужно передать аргументы (строки и списки) из lisp-функции в .net-функцию, так как лучше это сделать, чтобы в .net не заниматься парсингом?
Есть несколько пар аргументов lisp-функции типа ключ - значение_строка и ключ - значение_список, их и нужно передать для обработки. Списки представляют из себя 2D точки.
Пробовал несколько вариантов:
  1. Передавал только значения (без ключей) в строго определенном порядке. Минус в том, что нужно строго документировать порядок аргументов и их тип (строка или список).
  2. Передавал в виде точечных пар, но ResultBuffer не воспринимает их как пары, а создает набор аргументов типа TypedValue: начало списка (int RTLB = 5016; /* list begin */), значения (string, int и т.п.), конец списка, точнее точечной пары (int RTDOTE = 5018; /* dotted pair */).
  3. Преобразовывал ключ и список координат точки в строку с разделителем, а в .net обратно преобразовывал в точку. Как-то тупо имхо.
Есть ли более изящные способы передачи аргументов смешанного типа?
Цитата:
Сообщение от hwd Посмотреть сообщение
Примеры того, как на .net писать LISP функции, передавая им различные параметры и возвращая искомые, можешь глянуть здесь.
За ссылочку спасибо, мне ее уже гугл нашел с утра) Судя по примеру остается вариант 2 со скрупулезным разбором каждого элемента коллекции ResultBuffer.
crosandr вне форума  
 
Непрочитано 26.12.2012, 19:26
#9
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Цитата:
Сообщение от crosandr Посмотреть сообщение
Есть ли более изящные способы передачи аргументов смешанного типа?
Тебе нужно писать свой собственный wrapper чтобы быть независимым от
типа аргументов, где расписывать все типы, лучше наверно сделать
класс extension и потом его использовать в своих программах
Для начала посмотри здесь

http://spiderinnet1.typepad.com/blog...nd-output.html
Олег (jr.) вне форума  
 
Непрочитано 27.12.2012, 00:00
#10
crosandr

Инженер-строитель
 
Регистрация: 09.07.2010
Санкт-Петербург
Сообщений: 1,988


Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
Для начала посмотри здесь
Уже был там, спасибо)
Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
лучше наверно сделать
класс extension и потом его использовать в своих программах
Направление мысли понял, пожалуй имеет смысл
crosandr вне форума  
 
Непрочитано 27.12.2012, 00:13
#11
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от crosandr Посмотреть сообщение
Есть ли более изящные способы передачи аргументов смешанного типа?
Если в разрезе целиком .Net то можно использовать pattern matching (например, для этой цели я только его и использую), но он пока из "широкораспотраненных" есть только в F#, то есть на каждый TypedCode задаем свой шаблон распознавания-преобразования и потом любые "перегрузки" функции оформляются в одну строку. Вот самый простой пример - в той задаче больше не понадобилось, который использует только "полные шаблоны" - если въехать в неполные - то можно вобще творить чудеса - если будет интересно могу расписать поподробней. Если лень париться и лезть во что-то новое (изначально это "фишка" функциональных языков), наверное можно просто подождать, судя по тенденции, я пологаю, нечто подобное появится и в "общепринятом" C# (готов символиески поспорить на ближайшии 2-3 версии).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Net: Как через буфер ResultBuffer передать список точек?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение высотных отметок ряда точек (Z) через связь с таблицей Excel. bgrade AutoCAD 6 09.08.2012 09:30
Вставка фрагментов таблицы из Excel в таблицу Автокада 2006 через буфер обмена - возможно ли? kp+ AutoCAD 3 21.03.2008 10:32
вызов через command или передать объекты во внешнюю команду Mr_Eugene Программирование 4 20.10.2006 09:28
Проблемы с копирование через буфер обмена. zenon AutoCAD 2 22.12.2005 07:20
Ввод точек через вставку даних из буфера VOVAMAT AutoCAD 1 06.11.2005 13:30