КОМПАС-3D: Редактирование свойств макроэлемента через окно Свойства

Автор Aprf, 07.11.13, 17:00:06

« назад - далее »

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

Aprf

Добрый день!
В Компас-3D V15, насколько я понимаю, появилась возможность настраивать библиотечный макроэлемент так, чтобы можно было отображать и редактировать его свойства через стандартное окно "Свойства" (интерфейс ILibPropertyObject).
В SDK V15 появился пример на C++, но я к сожалению не разбираюсь в C++.

Не подскажете, как это можно реализовать на C#? Это возможно?

В стандартных примерах SDK для C# я вообще не нашел примеров, использования какого-то ни было интерфейса...

Придётся Вам разбираться, в любом случае сначала с событиями, а потом Visual С.

Aprf

Это-то понятно. Вопрос: можно ли это в принципе реализовать на C#?

И кстати, а причем тут события?

Потому, что то, что Вы хотите реализовать, без подписки на события не делается.

Aprf

Я правильно понял, что на C# реализовать отображение параметров программно созданного макрообъекта в стандартном окне свойств объекта в принципе невозможно?

>> Потому, что то, что Вы хотите реализовать, без подписки на события не делается.

А, если не сложно, можете хотя бы кратко рассказать порядок действий, чтобы реализовать это?
Или очень маленький примерчик?

Я на C# не программирую, а подробных примеров на картинке выше целый вагон.

Aprf

На картинке выше вы зачем-то привели скриншот раздела SDK/C#.
Там нет ни единого примера использования интерфейса ILibPropertyObject

Вы сами-то туда заглядывали? А если нет, то зачем его привели?

PS

Для работы со свойствами макрообъекта используются следующие интерфейсы:
- IPropertyMng - интерфейс менеджера свойств;
- IProperty - интерфейс свойства (там есть визуальный редактор свойства);
- IPropertyKeeper - Интерфейс получения/редактирования значения свойств;
+ Благодарностей: 1


psiv

Покажите, пожалуйста, на примере начинающему как на Delphi созданному макроэлементу назначить свойству "Наименование" значение, скажем, "Qwerty".

        doc.ksMacro(0);                     // создаем пустой макроэлемент
        MacroUGO:=doc.ksEndObj;             
        doc.ksUpdateMacro (MacroUGO, UGO);  // Добавляем группу в макроэлемент

333

Можно через API7
см IMacroObject::Name
Можно также через IPropertyKeeper но сложнее

psiv

Очередная попытка одолеть свойства макроэлементов...
Подскажите, пожалуйста, как правильно написать этот код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls, Data.DB,
  Data.Win.ADODB, Vcl.ExtCtrls, ComObj, LDefin2D, ksTLB;

  type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  iKompas: KompasObject;
  iDoc: ksDocument2D;
  MacroUGO: Reference;
  UGO: Integer; // указатель на группу примитивов для УГОшки

  iPropMng: Reference;
  iProp: Reference;
  iPropKeeper: Reference;
  id_prop: Integer; // указатель на идентификатор свойства

  implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  if iKompas = nil then
  begin
    iKompas := KompasObject(GetActiveOleObject('Kompas.Application.5'));
    // подключение к уже запущенному экземпляру Компаса

    if iKompas <> nil then
      iKompas.Visible := True;
  end;

  iDoc := ksDocument2D(iKompas.ActiveDocument2D);

  iPropMng := IPropertyMng(iDoc);
  iProp := iPropMng.GetProperty(iDoc, id_prop);
  iPropKeeper := IPropertyKeeper(MacroUGO);

  UGO := iDoc.ksNewGroup(0);         // создаем пустую группу
  iDoc.ksCircle(0, 0, 5, 1);         // рисуем окружность
  iDoc.ksEndGroup;                   // завершаем группу
  iDoc.ksMacro(0);                   // создаем пустой макроэлемент
  MacroUGO := iDoc.ksEndObj;         // завершаем макроэлемент
  iDoc.ksUpdateMacro(MacroUGO, UGO); // добавляем группу в макроэлемент

  id_prop := 5;
  iPropKeeper.SetPropertyValue(iProp, 'Что-нибудь...', True)

end;

end.

ТрындецЪ

Цитата: psiv от 19.09.18, 11:10:56
Подскажите, пожалуйста, как правильно написать этот код:
Цитата: кусок кодаiProp := iPropMng.GetProperty(iDoc, id_prop);
...
id_prop := 5;
Эту переменную вы вызываете раньше, чем задаёте её значение. Или Ваш ЯП это допускает?

psiv

Да, Игорь, это моя ошибка, спасибо.
Но моя основная проблема состоит в коде получения интерфейсов для работы со свойствами...
[dcc32 Error] Unit1.pas(51): E2003 Undeclared identifier: 'IPropertyMng'
[dcc32 Error] Unit1.pas(52): E2003 Undeclared identifier: 'GetProperty'
[dcc32 Error] Unit1.pas(53): E2003 Undeclared identifier: 'IPropertyKeeper'

ТрындецЪ

Кроме KompasObject нужен ещё IApplication а от него уже IPropertyMng.
И, кстати, тип id_prop не  Integer, а double.


psiv


ТрындецЪ


А примеры в SDK посмотреть не судьба?
Пример - Step1_API7_2D.
Получить API7 не так и трудно.
Kompas7:=Kompas.ksGetApplication7 as IApplication;