Добрый день!
Пытаюсь изменить ссылку на файл модели в ассоциативном виде, но метод 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 по моему, проще можно сделать, но Ваш код не верен.
Был бы презнателен, если б подсказали в чем неверен (хотя б направление куда копать)) В примерах нашел аналогичный - только изменение состояния видов... а вот параметры вида - не срабатывает. Или, если не трудно - подскажите через АПИ7. я с ним не работал...
Если с самого начала то в API7 структура такая: IApplication->IDocuments->IKompasDocument2D->IViewsAndLayersManager->IViews->IView->IAssociationView
а с помощью АПИ 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;
Замечание по поводу того, что внутри цикла - принимается))) код переделывал - скопипастил не туда) завтра попробую сманипулировать. спасибо за помощь!
Добрый день!
все-таки вопрос открыт)) Именно по манипуляциям) 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); лишнее, Вы структуру уже получили, кодом выше.
Опять копи-паст))) смотрел. доходит. один раз на основном виде. который и ссылается на модель. только i возвращается 0 и соответственно ничего не происходит. делал активным - тоже самое(
Ваш вопрос интересный, но хочу смотреть информацию отладчика.
Сталкивался с такой задачей. Может этот материал поможет...
//------------------------------------------------------------------------------
//Переопределить в ассоциативных видах чертежа файл модели
//------------------------------------------------------------------------------
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;
Добрый день!
А у Вас этот код отрабатывал? у меня почему-то не хотело создавать итератор как у Вас - poIterator:=CreateIterator(inObjType,poParentObj); возвращало 0. я переделал на iter:=ksIterator(kompas.GetIterator);
iter.ksCreateIterator(inObjType,poParentObj); и т.д.
Но вот iDocument2D.ksSetObjParam(refView, iAssociationViewParam, ASSOCIATION_VIEW_PARAM) все равно возвращает 0.
To Sabahs. К сожаленью отладчиком не пользуюсь, так как все эти манипуляции происводятся из плагина под ЛОЦМАН... Но то что туда доходит и метод возвращает 0 - точно)
Спасибо за помощь!
Я вообще думаю, а какой смысл его менять? Параметры вида Вы получили, можно сделать ход конём, удалить вид и на его месте создать новый, с нужной ссылкой на модель, я так думаю просто поменять файл источник не достаточно.
В данном случае достаточно и необходимо именно так... на виде уже могут быть проставлены размеры и выполнены другие манипуляции... а модель заменяется на аналогичную.
Максим, Вы хотите отделаться легким испугом, но так не получится. Вам нужно сначала разорвать связь со старым источником, затем определить новый источник, и определить, что из нового источника Вам нужно.
Тогда не понятно... почему это свойство не 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
т.е. все-таки без АПИ7 не обойтись? в апи5 тоже другие свойства есть. но мы ж их получаем. и менять не нужно. а только изменить имя файла...
Вы поменяли имя файла, откуда Компас узнает какой базовый объект и вид использовать, из нового файла?
начинает по-тихоньку проясняться) т.е. они естественно обнуляются... и в апи 5 этих свойств нет(
А кто Вам мешает использовать ksTransferReference или ksTransferInterface, хотя проще, сразу на API7 всё получить.
попробую разобраться. хоть и времени нет( никогда не использовал ранее апи7))) все когда то бывает в первый раз. Спасибо за помощь!
Сложного там ничего нет, я думаю Вы разберётесь.
Функция получения коллекции видов, KompasAPI:IApplication
//-------------------------------------------------------------------------------
// Получить указатель на интерфейс коллекции видов
function GetViews:IViews;
var
KompasDocument2D:IKompasDocument2D;
ViewsAndLayersManager:IViewsAndLayersManager;
begin
Result:=nil;
//Получить указатель на интерфейс документа Компас
KompasDocument2D:=KompasAPI.ActiveDocument as IKompasDocument2D;
if KompasDocument2D<>nil then
begin
//Получить указатель на интерфейс менеджера видов и слоёв
ViewsAndLayersManager:=KompasDocument2D.ViewsAndLayersManager;
if ViewsAndLayersManager<>nil then
begin
Result:=ViewsAndLayersManager.Views;
ViewsAndLayersManager:=nil;
end;
KompasDocument2D:=nil;
end;
end;
а где Вы взяли что iAssociationView имеет такие свойства...
BaseObject
- BaseView
- BendLinesStyle
- BendLinesVisible
- BreakLinesStyle
- BreakLinesVisible
- DimensionLayoutScaling
- ExplodedView
- HiddenLines
- HiddenLinesStyle
- HiddenLinesVisible
- Local
- ProjectionLink
- ProjectionName
- SameHatch
- Section
- SourceFileName
- Unfold
- Unfold
- VisibleLinesStyle
Из справки SDK.chm
А какая у Вас версия компас. У меня 10 и вот что -
13 версия.
мда.... тупик)
Можете скачать Компас HOME базовую часть, которая является бесплатной, но по крайней мере сможете программировать и иметь тот же функционал.
В том то и дело что мне нужно сделать под 10. хоме не катит(
Тогда, сложнее, API Компас V10, довольно древнее и честно говоря, на данный момент времени, является не актуальным и в ближайшее время, я думаю будет снято с технической поддержки.
Можете использовать PE Explorer для просмотра экспортируемых функций из DLL Компаса и если в V10 есть данные методы, то файлы описаний можно дописать.
Проверил под 13. Все работает даже написанное на апи 5. Выходит что в 10 версии данный вопрос нерешаем....