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

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

Страницы: 1 [2] 3 4 ... 10
11
Есть ли возможность реализовать в Autolispe  вызов типа данных ref ? Как обойти эту проблему?
Нет. Не пытайся передавать C#<->VisualLisp COM/ActiveX объекты.
12
AutoCAD .NET API / Как реализовать тип данных ref Object[] в AutoLispe?
« Последний ответ от alex-63 03-06-2025, 13:47:20 »
Какой тип данных соответствует  ссылке (exampe  C#   ref par
Код - C# [Выбрать]
  1.         object par = new Object[] { "" };
  2.         Obj.GetMnParam(ref par, OBP_VALUES);
  3.  
)
На JavaScript
Код - Javascript [Выбрать]
  1. var arrParam = new Array();
  2.       Obj.GetMnParam(arrParam, OBP_VALUES); // Получаем значения параметров
  3.  


в AutoLispe?

Реализация на AutoLIspe:
Импортирую typelibrary
Код - Auto/Visual Lisp [Выбрать]
  1.   (vlax-Import-Type-Library :tlb-filename file :methods-prefix    "sm-" :properties-prefix "sp-" :constants-prefix   "sc-")
  2.  (setq  refpar (vlax-make-variant (vlax-make-safearray  vlax-vbObject (cons 0 0))))
  3. (defun ak_list->variantArray0 (ptsList)    
  4. (vlax-make-variant (vlax-safearray-fill (vlax-make-safearray  vlax-vbvariant; element type
  5.                                           (cons 0 ;from
  6.                                                 (- (length ptsList) 1) ;to
  7.                                                 ) ; array dimension
  8.                                         )                      
  9.                         (mapcar 'vlax-make-variant ptsList)
  10.                      );fill
  11.     )                                  
  12. )
  13.  
(setq  refpar   (ak_list->variantArray0 '("")))
Ни этот (sm-GetMnParam obj refpar OBP_VALUES);
Ни этот вызов не работает (sm-GetMnParam  obj  'refpar OBP_VALUES);
Зато передача по значению срабатывает :
(setq  lPtsArray (ak_list->variantArray0 lPts)) ;     // получить массив координат
(if PL (sm-AddPoints PL  lPtsArray))
Есть ли возможность реализовать в Autolispe  вызов типа данных ref ? Как обойти эту проблему?

13
Нужно передавать ObjectID или ENAME.  VLA-OBJECT передать нельзя.
14
Код - C# [Выбрать]
  1. [LispFunction("ak_list->variant0")]
  2.  public ResultBuffer AkListToVariant(ResultBuffer args)
  3.  {
  4.      return args; // Pass-through (no conversion)
  5.  }
  6.  

1) Вызов (AK_LIST->VARIANT0 1) -> (1)
2 (AK_LIST->VARIANT0 OBJ)
error: invalid data type or data overflow: #<VLA-OBJECT IAcadCircle 0000000039a599c8>
Почему ошибка и как разработать функцию принимающую и возвращающую типы данных  VLA-OBJECT ?
Как то же написана функция VLAX-ENAME->VLA-OBJECT  как реализовать ее на C++ или C#  ?

15
Добрый всем день! Подскажите, пожалуйста, как программно возможно изменить значение отображения ручки для конкретного параметра динамического блока? Если это возможно.
16
AutoCAD .NET API / Re: Ошибка записи содержимого json в xrecord
« Последний ответ от Atomohod 01-06-2025, 20:31:35 »
И еще мне непонятно зачем преобразовывать json в BinaryChank. Это же чисто текстовые данные, а не двоичные.
Я пытался сначала через Asciistring, но по неведомой причине при обратном извлечении из xrecord у меня постоянно не возвращались два последних знака json. На разных json. Загадка.
17
AutoCAD .NET API / Re: Transparency
« Последний ответ от Lemieux 01-06-2025, 12:53:56 »
Нет более правильного способа?
Если задача считать все свойства у объекта, и куда-то записать то наверное try catch самый простой способ.
программа будет работать медленнее. Но возможно скорость будет на приемлемом уровне.
В каких-то случаях try catch может не спасти от вылета автокада.

Если без try, то в ряде случаев будут ошибки, придется хорошо изучить объект, прочитать документацию, провести тестирование.
На объектах с кучей свойств может уйти много времени.
Например BlockTableRecord может быть ссылкой, и логично проверить, является ли он ссылкой IsFromExternalReference, а потом считывать путь к файлу PathName.
А кто сказал, что построение систем лёгкое и весёлое занятие? Я сейчас занимаюсь разработкой под продукты другого разработчика. И архитектура AutoCAD и его API это верх совершенства.
Как по мне, автор топика в своих же вопросах даёт ответы.
И try-catch нужен только тогда, когда мы не можем предугадать результат. Например при HTTP запросе, связь может оборваться, или обращение к серверу на другой машине. А тут у Вас система, состояние которой, по идее, Вы должны знать.
18
AutoCAD .NET API / Re: Transparency
« Последний ответ от avc 30-05-2025, 16:25:52 »
недействительные вы отсеяли, но остались, например, По Слою или По блоку. А вы у них опять пытаетесь получить прозрачность.
19
AutoCAD .NET API / Re: Transparency
« Последний ответ от DimVer 30-05-2025, 16:18:31 »
Да в API Автокада каждое первое свойство и метод могут вызвать исключения. А то и фатал Автокада. Надо по аккуратнее. Анализировать наиболее важные свойства прежде чем пытаться извлекать другие. Если IsInvalid, то зачем вы пытаетесь читать другие свойства? Transparency вроде не фаталит, но зачем? Зачем читать Alpha, если и так известно что IsClear, IsSolid, ByLayer или ByBlock ? Отлов исключений программу точно не ускорит.
Можно тогда узнать значение свойства IsInvalid?
Ради интереса написал такой кода:

public TransparencyDto Map()
{
    Document acDoc = Application.DocumentManager.MdiActiveDocument;

    if (_transparency.IsInvalid)
    {
        acDoc.Editor.WriteMessage($"\nTransparency is invalid");
        return new TransparencyDto
        {
            Alpha = 255,
            IsByAlpha = false,
            IsByBlock = false,
            IsByLayer = false,
            IsClear = false,
            IsInvalid = true,
            IsSolid = false
        };
    }
    else
    {
       
        acDoc.Editor.WriteMessage($"\nTransparency is valid:");
    }

    var transparencyDto = new TransparencyDto();

    try { transparencyDto.Alpha = _transparency.Alpha; } catch { acDoc.Editor.WriteMessage($"\nException 1"); }
    ;
    try { transparencyDto.IsByAlpha = _transparency.IsByAlpha; } catch { acDoc.Editor.WriteMessage($"\nException 2"); }
    ;
    try { transparencyDto.IsByBlock = _transparency.IsByBlock; } catch { acDoc.Editor.WriteMessage($"\nException 3"); }
    ;
    try { transparencyDto.IsByLayer = _transparency.IsByLayer; } catch { acDoc.Editor.WriteMessage($"\nException 4"); }
    ;
    try { transparencyDto.IsClear = _transparency.IsClear; } catch { acDoc.Editor.WriteMessage($"\nException 5"); }
    ;
    try { transparencyDto.IsInvalid = _transparency.IsInvalid;} catch { acDoc.Editor.WriteMessage($"\nException 6"); }
    try { transparencyDto.IsSolid = _transparency.IsSolid; } catch { acDoc.Editor.WriteMessage($"\nException 7"); }
    ;

    return transparencyDto;
}

Получает объект валидный, но в консоли автокада:
Transparency is valid:
Exception 1
Exception 5
Exception 7


Или валидный это значит, то он проиницилизирован, но при этом всегда есть свойства при обращении к которым будет эксцепшн?
20
Длина DxfCode.BinaryChunk если мне не изменяет память 256 байт (байт длины и 255 байт данных). А ты пытаешься загнать в него 100K. Само собой будет ошибка.
https://adndevblog.typepad.com/autocad/2013/02/dxf-files-binary-chunk-interpretation.html
И еще мне непонятно зачем преобразовывать json в BinaryChank. Это же чисто текстовые данные, а не двоичные.
Страницы: 1 [2] 3 4 ... 10