All Forums
 Категория Visio
 Форум Вопросы и ответы
 Подмена мастер-шейпа
Author Previous Topic Topic Next Topic  

bdfy

Belarus
267 Posts

Posted - 07/31/2009 :  21:32:44
создал новый мастер. нужно в чертеже теперь все его копии заменить на новые. по идее можно было бы просто открыть старый мастер и вставить туда новую фигуру, ан нет. старый мастер был box. новый - line. в итоге теряются углы поворота, shape data и т.д.
написал макрос который должен шейпы менять. да вот незадача - одно из свойств обьекта ("Prop._VisDM_name" - тип текст) упорно не переносится (( в чем дело ?
quote:
Sub заменить_шейпы()
On Error Resume Next
Set vs = Application.ActiveWindow.Selection

Set library = Application.ActiveDocument.Masters

newmaster = "Xnew"

For Each sh In vs

If sh.Master = "X" Then

params = Array("Prop._VisDM_num", "Prop._VisDM_X")

Application.ActiveWindow.Page.Drop library.ItemU("Xnew"), 0, 0
Set newsh = Application.ActiveWindow.Selection(1)

Debug.Print newsh.Name

w = sh.Cells("Width")
h = sh.Cells("Height")
x = sh.Cells("pinX")
y = sh.Cells("pinY")
ang = sh.Cells("angle")

newsh.Cells("BeginX") = x - (w / 2) * Cos(ang)
newsh.Cells("BeginY") = y - (w / 2) * Sin(ang)

newsh.Cells("EndX") = x + (w / 2) * Cos(ang)
newsh.Cells("EndY") = y + (w / 2) * Sin(ang)
Debug.Print "name " & " " & sh.Cells("Prop._VisDM_name") 'Вот это имя ноль возвращает (((
newsh.Cells("Prop._VisDM_name") = sh.Cells("Prop._VisDM_name")

For Each p In params
newsh.Cells(p) = sh.Cells(p)
Debug.Print "param " & p & " " & sh.Cells(p)
Next p

sh.Delete
End If
Next sh


End Sub

файлик тут
http://rapidshare.de/files/48002171/replace.vsd.html

Tumanov

Russia
1198 Posts

Posted - 08/01/2009 :  05:09:58
Свойством объекта Cell по умолчанию является .ResultIU.
То есть запись sh.Cells("Prop._VisDM_name") эквивалентна sh.Cells("Prop._VisDM_name").ResultIU.
Свойство ResultIU возвращает результат Double, а у Вас в этой ячейке текст.
Для текстовых ячеек нужно читать формулу, например
sh.Cells("Prop._VisDM_name").Formula
Go to Top of Page

bdfy

Belarus
267 Posts

Posted - 08/01/2009 :  08:39:07
понятно. заработало. непонятно другое.
был в документе мастер "Х". я везде заменил на "Хnew". потом переименовал X в Xold, Xnew в X.
и все равно - вытягиваю на страницу Х (новый мастер) - имя у него с Xnew начинается.
вытягиваю программно Х
Application.ActiveWindow.Page.Drop Application.ActiveDocument.Masters.ItemU("X"), 0, 0
старый мастер вытягивается. который теперь Хold называется. в чем дело ? как с именами разобратся ?
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 08/01/2009 :  10:17:51
Это (почти) уже обсуждалось. По разному ведут себя имена Name и NameU.
Вот кусок оттуда:
Ошибка проистекает из того, что шейпы в Visio имеют не одно имя. В данном случае конфликтуют имена Name и NameU.
Name - это имя локализованное. Пользовательский интерфейс позволяет работать именно с ним. При локализации приложения, это имя обычно переводится. То есть в разных странах оно будет иметь разное значение.
NameU - универсальное имя. Оно не изменяется при локализации и через него ведутся все ссылки в формулах шейп-листа. NameU через пользовательский интерфейс не доступно.
У вновь созданного шейпа имени нет, есть только ID. Ссылки на такой шейп идут через имя NameID. Это сочетание Sheet и ID, например, Sheet.5.
При первом присвоении имени через пользовательский интерфейс оно пишется и в Name, и в NameU. При дальнейшем переименовании NameU уже не изменяется, изменяется только Name. Вот это у Вас и происходит - Вы меняете локализованное имя, а в ссылках остается универсальное.
Исправить универсальное имя можно, например, программно. Вот такой простейший макрос
Sub ttt()
ActiveWindow.Selection(1).NameU = "first"
End Sub
присвоит ему значение "first".
Go to Top of Page

bdfy

Belarus
267 Posts

Posted - 08/01/2009 :  11:28:03
вспомнил ) не первый раз уже на эти грабли наступаю. не пришло в голову что это и на master шейпы распространяется.
вот так решил
quote:
Sub ttt()
Application.ActiveDocument.Masters.ItemU("X").Name = "Xold"
Application.ActiveDocument.Masters.ItemU("X").NameU = "Xold"

Application.ActiveDocument.Masters.ItemU("Xnew").Name = "X"
Application.ActiveDocument.Masters.ItemU("Xnew").NameU = "X"

End Sub

в надцатый раз с этим переименованием попадаю. скоро зарекусь какие то имена через GUI менять вообще.

Edited by - bdfy on 08/01/2009 11:36:57
Go to Top of Page

oleg753

26 Posts

Posted - 05/11/2011 :  17:05:15
quote:
Originally posted by Tumanov

Это (почти) уже обсуждалось. По разному ведут себя имена Name и NameU.
Вот кусок оттуда:
Ошибка проистекает из того, что шейпы в Visio имеют не одно имя. В данном случае конфликтуют имена Name и NameU.
Name - это имя локализованное. Пользовательский интерфейс позволяет работать именно с ним. При локализации приложения, это имя обычно переводится. То есть в разных странах оно будет иметь разное значение.
NameU - универсальное имя. Оно не изменяется при локализации и через него ведутся все ссылки в формулах шейп-листа. NameU через пользовательский интерфейс не доступно.
У вновь созданного шейпа имени нет, есть только ID. Ссылки на такой шейп идут через имя NameID. Это сочетание Sheet и ID, например, Sheet.5.
При первом присвоении имени через пользовательский интерфейс оно пишется и в Name, и в NameU. При дальнейшем переименовании NameU уже не изменяется, изменяется только Name. Вот это у Вас и происходит - Вы меняете локализованное имя, а в ссылках остается универсальное.
Исправить универсальное имя можно, например, программно. Вот такой простейший макрос
Sub ttt()
ActiveWindow.Selection(1).NameU = "first"
End Sub
присвоит ему значение "first".

Не знаю, туда ли я пишу, все же рискну. У меня мастер шейп назывался сначала "Модульный кабель". Я об этом узнал так: создал на странице его клон, далее правой кнопкой "формат", "специальный..." в открытом окне в строчке Образец надпись: "Модульный кабель:Страница" Далее я делал какие-то телодвижения с мастер шейпом и его имя стало "Модульный кабель.45" и теперь макрос не работает, как мне отредактировать это имя?
Go to Top of Page

Surrogate

Russia
122 Posts

Posted - 05/11/2011 :  19:20:43  Visit Surrogate's Homepage
отредактировать имя можно также как и посмотреть. Формат->Специальный->Имя. вот только если имя "Модульный кабель" на странице уже есть, то переименовать не получится. Ибо нельзя сделать 2 шейпа на странице с одинаковыми именами!

может я конечно что-то не понял. у меня Visio англоязычный
quote:
в открытом окне в строчке Образец надпись: "Модульный кабель:Страница" Далее я делал какие-то телодвижения с мастер шейпом и его имя стало "Модульный кабель.45"

имя шейпа = надпись в строчке образец ?



Go to Top of Page

oleg753

26 Posts

Posted - 05/12/2011 :  10:54:59
quote:
Originally posted by Surrogate

отредактировать имя можно также как и посмотреть. Формат->Специальный->Имя. вот только если имя "Модульный кабель" на странице уже есть, то переименовать не получится. Ибо нельзя сделать 2 шейпа на странице с одинаковыми именами!





Это да, это все правильно, но относится к уникальному шейпу, а мне надо изменить имя мастер-шейпа, которое как я понял дописано в начале полного имени.

имя шейпа = надпись в строчке образец ?
Нет, надпись в строчке образец = "Модульный кабель.45:Страница"
а имя шейпа такое, как сам вводишь в строчке "Имя" в Данном случае "Модульный кабель.1645" И да, оно присваивается уникальным образом, проверяя на странице есть ли уже такое.
Короче: мне надо убрать ".45" из надписи в строчке образец "Модульный кабель.45:Страница"

Edited by - oleg753 on 05/12/2011 10:57:07
Go to Top of Page

Surrogate

Russia
122 Posts

Posted - 05/12/2011 :  14:28:27  Visit Surrogate's Homepage
Имя мастера-шейпа можно поменять в окне DocumentStencil, выбрать интересующий мастер. Щелкнуть правой клавишей мыши, и выбрать пункт переименовать ...

а вообще если нужно сделать на листе много однотипных шейпов, какой алгоритм работы?
1. Все шейпы вытаскиваются только из ДокументСтенсила.
2. Первые образцы шейпа берутся из ДокументСтенсила, дальше часть однотипных шейпов копируется на базе шейпов уже размещенных на листе.

как вариант могу допустить, что в ДокументСтенсиле уже есть мастер-шейп "Модульный кабель:Страница". если в него попытаться добавить модифицированный вариант мастершейпа, то для уникальности имени местершейпа к нему будет добавлен идентификатор например .45!

я сам не раз с последним вариантом накалывался :(

Go to Top of Page

oleg753

26 Posts

Posted - 05/13/2011 :  06:32:38
quote:
Originally posted by Surrogate



как вариант могу допустить, что в ДокументСтенсиле уже есть мастер-шейп "Модульный кабель:Страница". если в него попытаться добавить модифицированный вариант мастершейпа, то для уникальности имени местершейпа к нему будет добавлен идентификатор например .45!

я сам не раз с последним вариантом накалывался :(




В том то и вопрос, что в ДокументСтенсиле я удалил все стенсилы с именем "Модульный кабель" и их производных, но при создании нового стенсила "Модульный кабель" ему присваивается имя "Модульный кабель.х", где х - какой-то индекс. Такое ощущение, что в ДокументСтенсилескрытая индексация имен.
В любом случае свою проблему я решил, создав в новом файле новый документстенсил и в нем свой мастер шейп, а потом просто скопировал его к себе. Surrogate, спасибо за участие.
Go to Top of Page
  Previous Topic Topic Next Topic  
Данный сайт является архивом форума visio.artberg.ru, который был закрыт в связи с переходом на новую платформу visio.getbb.ru
Все материалы доступны только для чтения! Если у вас появились вопросы, или вы хотите что-то обсудить, связанное с Visio, обращайтесь на новый форум!
Архив был создан благодаря совместным усилиям Генадия Туманова @Tumanov (visio.artberg.ru), Александра ака @Surrogate (visio.getbb.ru), и Николая Белых @nbelyh (unmanagedvisio.com)