Изменение ссылки на модель в ассоциативном виде

Автор Maxxx, 10.07.12, 10:33:36

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

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

Maxxx

Добрый день!
Пытаюсь изменить ссылку на файл модели в ассоциативном виде, но метод ksSetObjParam возвращает 0 и ничего не происходит. Кто-нибудь сталкивался? Что не так?
Вот кусок кода
var
  iter:ksIterator;
  refDoc:Reference;
  v: ksAssociationViewParam;
  FName : string;
  i:Integer;
  ltvar: ksLtVariant;
begin
  //Создаем итератор перебора видов в документе
  iter:=ksIterator(kompas.GetIterator);
  iter.ksCreateIterator(VIEW_OBJ,0);

  refDoc:=iter.ksMoveIterator('F');
  while refDoc > 0 do
   begin
     v := ksAssociationViewParam(kompas.GetParamStruct(ko_AssociationViewParam));
     v.Init;
     ltvar := ksLtVariant( kompas.GetParamStruct(ko_LtVariant) );
      if ltvar = nil then
        exit;

      ltvar.Init();

      ltvar.intVal := stCURRENT;
      doc2d.ksSetObjParam( refDoc, ltvar, VIEW_LAYER_STATE);



     doc2d.ksGetObjParam(refDoc,v,ASSOCIATION_VIEW_PARAM);
     FName :=v.fileName;
     if FName <> '' then
      begin
        if FileNameOld = '' then FileNameOld := FName;
        v.fileName :=FileNameNew;
        if v.projectionLink = false then
        begin
          kompas.ksMessage('Новая ссылка - '+v.fileName);
          i:=Doc2D.ksSetObjParam(refDoc,v,ASSOCIATION_VIEW_PARAM);

        end;
      end;

     refDoc:=iter.ksMoveIterator('N');
   end;
   iter.ksDeleteIterator;
   Doc2D.ksRebuildDocument;
end;

Через API7 по моему, проще можно сделать, но Ваш код не верен.

Maxxx

Был бы презнателен, если б подсказали в чем неверен (хотя б направление куда копать)) В примерах нашел аналогичный - только изменение состояния видов... а вот параметры вида - не срабатывает. Или, если не трудно - подскажите через АПИ7. я с ним не работал...

Если с самого начала то в API7 структура такая: IApplication->IDocuments->IKompasDocument2D->IViewsAndLayersManager->IViews->IView->IAssociationView


Maxxx

а с помощью АПИ 5 - вопрос не решаемый? или решаемый - но сложно?

Решаемый и в API5, просто эти две строки внутри цикла убили наповал.
v := ksAssociationViewParam(kompas.GetParamStruct(ko_AssociationViewParam));
ltvar := ksLtVariant( kompas.GetParamStruct(ko_LtVariant) );
Готового кода нет, так примерно накидал.
v:=ksAssociationViewParam(kompas.GetParamStruct(ko_AssociationViewParam));
Iter:=ksIterator(kompas.GetIterator);
Iter.ksCreateIterator(VIEW_OBJ,0);
refDoc:=Iter.ksMoveIterator('F');
while BOOL(Doc2D.ksExistObj(refDoc)) do
  begin
    V.Init;
    if(Doc2D.ksGetObjParam(refDoc,V,ASSOCIATION_VIEW_PARAM))<>0 then
     begin
      Здесь уточняете, что вид тот, что искали, производите все необходимые манипуляции и выходите из цикла установив refDoc:=0;
     end;
    if refDoc<>0 then refDoc:=Iter.ksMoveIterator('N');
  end;

Maxxx

Замечание по поводу того, что внутри цикла - принимается))) код переделывал - скопипастил не туда) завтра попробую сманипулировать. спасибо за помощь!

Maxxx

Добрый день!
все-таки вопрос открыт)) Именно по манипуляциям)  i:=Doc2D.ksSetObjParam(refDoc,v,ASSOCIATION_VIEW_PARAM); - почему-то не срабатывает. может подскажете что не так? 

iter:=ksIterator(kompas.GetIterator);
  iter.ksCreateIterator(VIEW_OBJ,0);
  v := ksAssociationViewParam(kompas.GetParamStruct(ko_AssociationViewParam));


  refDoc:=iter.ksMoveIterator('F');
  //while refDoc > 0 do
  while Boolean(Doc2D.ksExistObj(refDoc)) do
   begin
     v.Init;

     if(Doc2D.ksGetObjParam(refDoc,V,ASSOCIATION_VIEW_PARAM))<>0 then
     begin

       doc2d.ksGetObjParam(refDoc,v,ASSOCIATION_VIEW_PARAM);
       FName :=v.fileName;
       if FName <> '' then
        begin
          v.fileName :=FileNameNew;
          if v.projectionLink = false then
          begin
            i:=Doc2D.ksSetObjParam(refDoc,v,ASSOCIATION_VIEW_PARAM);
          end;
        end;

     end;

     refDoc:=iter.ksMoveIterator('N');
   end;
   iter.ksDeleteIterator;
   Doc2D.ksRebuildDocument;
end;


А Вы отладчиком, смотрели? По моей логике до  i:=Doc2D.ksSetObjParam(refDoc,v,ASSOCIATION_VIEW_PARAM); дойти не должно, хотя могу заблуждаться и вид, желательно сделать активным для внесения изменений, у неактивного вида, могут быть активизированы внутренние блокировки. 
Это doc2d.ksGetObjParam(refDoc,v,ASSOCIATION_VIEW_PARAM); лишнее, Вы структуру уже получили, кодом выше.

Maxxx

Опять копи-паст))) смотрел. доходит. один раз на основном виде. который и ссылается на модель. только i возвращается 0 и соответственно ничего не происходит. делал активным - тоже самое(

Ваш  вопрос интересный, но хочу смотреть информацию отладчика.

Slaviation

Сталкивался с такой задачей. Может этот материал поможет...

//------------------------------------------------------------------------------
//Переопределить в ассоциативных видах чертежа файл модели
//------------------------------------------------------------------------------

function fnAssociationViewsRedefine(iKompasObject: KompasObject; iDocument2D: ksDocument2D; strOldFileName, strNewFileName: String; boExMode: Boolean = False): Boolean;
var
  KompasObjResearcher: TKompasObjResearcher;
  count, i: Integer;
  refView: Reference;
  iAssociationViewParam: ksAssociationViewParam;
begin
  Result := False;
  try
    KompasObjResearcher := TKompasObjResearcher.Create;
    if KompasObjResearcher <> nil then
    begin
      count := KompasObjResearcher.fnResearchInCurrentView(VIEW_OBJ, 100, 0);
      if count > 0 then
      begin
        iAssociationViewParam := ksAssociationViewParam(iKompasObject.GetParamStruct(ko_AssociationViewParam));
        iAssociationViewParam.Init;

        for i := 0 to count - 1 do
        begin
          refView := KompasObjResearcher.fnGetObjByIndex(i);
          if refView = 0 then Continue;
          if iDocument2D.ksGetObjParam(refView, iAssociationViewParam, ASSOCIATION_VIEW_PARAM) <> 0 then
          begin
            //Если ассосиативный вид ссылается не на тот файл 3D-модели
            if boExMode then
            begin
              if not AnsiSameText(ExtractFileName(iAssociationViewParam.fileName), ExtractFileName(strOldFileName)) then Continue;
            end
            else
            begin
              if not AnsiSameText(iAssociationViewParam.fileName, strOldFileName) then Continue;
            end;
            //Переопределяем ссылку на файл 3D-модели
            iAssociationViewParam.fileName := strNewFileName;
            if iDocument2D.ksSetObjParam(refView, iAssociationViewParam, ASSOCIATION_VIEW_PARAM) = 1 then
            begin
              iDocument2D.ksRebuildDocument;
              Result := True;
            end;
            break;
          end;
        end;
      end;
      FreeAndNil(KompasObjResearcher);
    end;
  except
    if KompasObjResearcher <> nil then FreeAndNil(KompasObjResearcher);
    iKompasObject.ksError(_TS(strAssocViewErr));
  end;
end;

Maxxx

Добрый день!
А у Вас этот код отрабатывал? у меня почему-то не хотело создавать итератор как у Вас - poIterator:=CreateIterator(inObjType,poParentObj); возвращало 0. я переделал на iter:=ksIterator(kompas.GetIterator);
  iter.ksCreateIterator(inObjType,poParentObj); и т.д.

Но вот iDocument2D.ksSetObjParam(refView, iAssociationViewParam, ASSOCIATION_VIEW_PARAM) все равно возвращает 0.



To Sabahs. К сожаленью отладчиком не пользуюсь, так как все эти манипуляции происводятся из плагина под ЛОЦМАН... Но то что туда доходит и метод возвращает 0 - точно)

Спасибо за помощь!

Я вообще думаю, а какой смысл его менять? Параметры вида Вы получили, можно сделать ход конём, удалить вид и на его месте создать новый, с нужной ссылкой на модель, я так думаю просто поменять файл источник не достаточно.

Maxxx

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

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

Maxxx

Тогда не понятно... почему это свойство не readonly...
ksAssociationViewParam::fileName,
Имя файла документа трехмерного объекта.

Тип данных - BSTR.

Синтаксис Automation:

fileName = iAssViewParam.fileName
Получить свойство (*)

iAssViewParam.fileName = fileName
Установить свойство (*)

fileName = iAssViewParam.GetFileName()
Получить свойство (**)

iAssViewParam.SetFileName(fileName)
Установить свойство

p.s - не подскажите где посмотреть аналогичный пример?

Вы поменяли файл, но в IAssociationView (API7) есть и другие свойства и их тоже нужно правильно установить:
- BaseObject
- BaseView
- BendLinesStyle
- BendLinesVisible
- BreakLinesStyle
- BreakLinesVisible
- DimensionLayoutScaling
- ExplodedView
- HiddenLines
- HiddenLinesStyle
- HiddenLinesVisible
- Local
- ProjectionLink
- ProjectionName
- SameHatch
- Section
- SourceFileName
- Unfold
- Unfold
- VisibleLinesStyle

Maxxx

т.е. все-таки без АПИ7 не обойтись? в апи5 тоже другие свойства есть. но мы ж их получаем. и менять не нужно. а только изменить имя файла...

Вы поменяли имя файла, откуда Компас узнает какой базовый объект и вид использовать, из нового файла?