Перехват начала любого изменения любого документа (2d, 3d)

Автор SerGoVec, 11.02.16, 15:27:14

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

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

SerGoVec

Всем привет!
Задача: программно запретить любые действия с документом (чертеж, деталь, сборка), которые приводят к его изменению.
Как можно сделать?

В момент открытия установить свойство IKompasDocument.ReadOnly - только для чтения.

SerGoVec

что-то не получается

function ApplicationEvent.OpenDocument(newDoc: Reference; docType: integer): WORDBOOL;
var
  doc: IKompasDocument;
begin
  ksMessage( 'Был открыт документ' );
  if KompasAPI = nil then
    KompasAPI := IDispatch(CreateKompasApplication) as IApplication;

    doc := KompasAPI.ActiveDocument;
    doc.ReadOnly;
end;

или по-другому ?

ps. KompasAPI - ksAPI7.IApplication


SerGoVec

да :-)))
Проблема-то вот в чем: пользователь может все менять (менять геометрию, свойства) сохранить только нельзя. Можно ли при попытке изменить геометрию, например, выдать ругательные сообщения? (ps. а еще лучше блокировать возможность изменения модели).

Тогда подписываетесь на события IObject2DNotify и IObject3DNotify, и запрещаете любое изменение.

zergud

доброе время суток!
в дополнение темы:
"IObject2DNotify и IObject3DNotify" мы перехватим изменение геометрии..
а как перехватить изменение свойств: меню Файл => "Свойства модели", "Свойства чертежа"
?

Вы сначала в справке данные интерфейсы посмотрите, а потом вопросы задавайте.
BeginPropertyChanged - начало изменения свойств объекта.

SerGoVec

Проделал эсперимент (для теста использвал 2д документ SAMPLE4.cdw из папки SAMPLES): использовал, в качестве основы библиотеку step12. Прописал:

function Object2DEvent.IsNotifyProcess( notifyType: SYSINT ) : WORDBOOL;
begin
  Result := ( notifyType >= koChangeActive ) And ( notifyType <= koPropertyChanged);
  //позже прописал (Result := True) эфффект тот же
end;

В функциях поставил точку останова (на begin):

function Object2DEvent.BeginPropertyChanged(objRef: Integer): WordBool;
begin
  ksMessage('Начаты изменения свойств');
  Result := true;
end;

function Object2DEvent.PropertyChanged(objRef: Integer): WordBool;
begin
  Result := true;
end;

Эффект: при изменении выносной линии в чертеже срабатывает

function Object2DEvent.UpdateObject(objRef: Integer): WORDBOOL;
begin
  UpdateSlideBox();
  Result := true;
end;

а при попытке изменить свойства чертежа, например наименование или попытке  поменять основную надпись в чертеже ничего не происходит. Как отловить события BeginPropertyChanged, PropertyChanged?

Для штампа свои события IStampNotify.
А если Вы хотите запретить изменение свойств, то нужно писать так:
function Object2DEvent.BeginPropertyChanged(objRef: Integer): WordBool;
begin
  Result:=False;
end;