All Forums
 Категория Visio
 Форум Вопросы и ответы
 SaveAs
Next Page
Author Previous Topic Topic Next Topic

Bad_BoY

9 Posts

Posted - 08/03/2006 :  18:02:08
Здраствуйте. Подскажите мне пожалуста как можно решить вот такой вопрос. У меня есть множество схем сделанних в Visio. Мне нужно все пересохранить в какой нибуть формат типа jpeg, tiff, eps. Как мне выделив нужную схему сохранить в нужний формат с помощью макроса. Подскажите пожалуста начинающему.

Tumanov

Russia
1198 Posts

Posted - 08/03/2006 :  18:38:09
Недавно мне задавали такой вопрос через email. Я даже ответил, но отослать письмо по предложенному адресу ну никак не удалось... :)
Повторяю ответ здесь.

"Добрый день!
Вот три примерчика, которые могут Вам помочь.
Первые два - на тему экспорта страницы Visio в html или графические форматы.
Третий пример - типа оболочки, которая перебирает все файлы Visio,
находящиеся в заданной папке и сохраняет их в формате предыдущей версии
Visio.
Скомбинировав эти примеры, можно получить нужный Вам макрос.

================================================
Export pages:
These are examples of how to export pages in various formats.
Sub ExportHTML()
Dim pageObj As Visio.Page
Dim filename As String
Set pageObj = ThisDocument.Pages.Item("page-1")

filename = "c:\tmpHTML.html"
pageObj.Export filename

or

pageObj.Export ("C:\temp\temp.jpg")

End Sub

================================================
... and from Graham Wideman
This particular example cranks through all the pages in a single Visio file,
and outputs GIF and WMF versions, using the visio file's directory as the
location, and the page name as the base file name.
Set Pgs = Application.ActiveDocument.Pages
For N = 1 To Pgs.Count
Set Pg = Pgs(N)
PgName = Pg.Name

ExportName = Application.ActiveDocument.Path + PgName + ".GIF"
Pg.Export ExportName

ExportName = Application.ActiveDocument.Path + PgName + ".WMF"
Pg.Export ExportName
Next N

================================================
Save as V5 Dir:
This is similar to the above routine, but it does it for all Visio files in
a specific directory.
Sub SaveAsV5Dir()
Dim PathFileName As String, PathName As String, CurrFileName As String
Dim FullFileName As String, NewPathName As String
Dim Dirs(500) As String, DirCnt As Integer, DirIndx As Integer
Dim DocObj As Visio.Document
' Set the default pathname
PathName = "C:\Visio\"
NewPathName = "C:\Visio\V5Files\"
' Set the default pathname
PathFileName = PathName & "*.vsd"
DirCnt = 0
CurrFileName = Dir(PathFileName)
Do While CurrFileName <> ""
DirCnt = DirCnt + 1
Dirs(DirCnt) = CurrFileName
CurrFileName = Dir
Loop

For DirIndx = 1 To DirCnt
CurrFileName = Dirs(DirIndx)
Debug.Print CurrFileName
FullFileName = PathName & CurrFileName
Debug.Print FullFileName
Set DocObj = Documents.Open(FullFileName)
DocObj.Version = &H50000

FullFileName = NewPathName & CurrFileName
Debug.Print FullFileName
Debug.Print " "
DocObj.SaveAs FullFileName
DocObj.Close
Set DocObj = Nothing
Next DirIndx
End Sub
"
Go to Top of Page

Bad_BoY

9 Posts

Posted - 08/03/2006 :  18:52:47
Спасибо за екзампел експорта. Но у меня есть у Визио файле 10 страниц на каждой странице по 10 схем как мне вибрать нужную схему и експортировать её в нужний мне файл. И как к примеру выставить при сохранении нужние мне разрешение файла к примеру 3000х3000 и rezolution 300?

Edited by - Bad_BoY on 08/03/2006 20:04:47
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 08/03/2006 :  22:41:30
Visio экспортирует страницу, шейп или набор селектированных шейпов.
Если Вы выделите на странице нужный блок шейпов (схему), и в выражении
object.Export fileName в качестве объекта используете Selection, то оно и экспортируется.
А вот с разрешением точно не помню - либо используются только установки по умолчанию, либо последние установки, использованные при ручном сохранении функцией Save As... Параметры при выызове метода не передаются.
Go to Top of Page

Bad_BoY

9 Posts

Posted - 08/05/2006 :  12:54:08
Спасибо большое написал вот так: pageObj.Application.ActiveWindow.Selection.Export()и всё работает.
Я хотел задать ещё один вопрос. Как то можно навесить процедуру кнопочного переход с одной групи шейпов на другую(тоесть переход с одной схеми на другую с помощью кнопки на форме где находится наша кнопка с процедурой). Как хоть б эта процедура выглядит примерно?

Edited by - Bad_BoY on 08/05/2006 13:36:28
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 08/05/2006 :  14:48:52
Вопрос совершено непонятен.
Что Вы называете словом "переход"?
Visio позволяет снять селектирование с одних шейпов, селектировать другие... Но при этом должен существовать какой-то критерий отбора шейпов, которые нужно селектировать. Например, если каждую Вашу "схему" сгруппировать, то на рисунке будет всего несколько шейпов-групп. Значит, селектируя их путем перебора, можно будет по очереди вывести все "схемы".
Go to Top of Page

Bad_BoY

9 Posts

Posted - 08/05/2006 :  15:47:20
Я вот это и имел ввиду, у меня все схемы каждая по отдельности сгрупированы. Каким способом мне можно к примеру если у меня одна схема сейчас выделена снять с нее виделение и выделить следущую схему?
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 08/05/2006 :  18:39:57
For Each Sh In ActivePage.Shapes
ActiveWindow.DeselectAll
ActiveWindow.Select Sh, visSelect
Next
ActiveWindow.DeselectAll
Go to Top of Page

Bad_BoY

9 Posts

Posted - 08/07/2006 :  10:22:59
Я вешаю то что вы написали на кнопку но оно не работает. :(
Go to Top of Page

brace

Russia
358 Posts

Posted - 08/07/2006 :  15:31:35
в визио 2003 есть макрорекордер
он позволяет плучить макрос VBA действий юзера ...
по созданию и удалению шейпов и др.
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 08/07/2006 :  22:07:29
Так я же просто показал принцип. Как можно перебрать всю коллекцию шейпов, селектируя их по очереди.
А для того, чтобы проталкивать это по кнопке, проще всего будет где-то запоминать индекс текущего шейпа и с каждым нажатием переходить на следующий индекс.
Например, при открытии формы или очередной страницы сохраняете в глобальной переменной Shapes.Count и с каждым нажатием уменьшаете его. Так до нуля.
Тогда Sh присваивается не по For Each, а по
Set Sh = ActivePage.Shapes(ТотСамыйТекущийИндекс)
Вместо цикла при каждом нажатии проверяете, не достиг ли индекс нуля.
А для селекта пользоваться точно такими же двумя строчками
ActiveWindow.DeselectAll
ActiveWindow.Select Sh, visSelect
(снять предыдущее селектирование и селектировать очередной шейп Sh).
Go to Top of Page

Bad_BoY

9 Posts

Posted - 08/08/2006 :  21:37:41
Вот написал вот это:
Private Sub CommandButton2_Click()
Dim i As Integer
Dim docObj As Visio.Shapes
For i = 1 To ActivePage.Shapes.Count = ActivePage.Shapes.Count - 1
Set docObj = ActivePage.Shapes.Item(i)
Set Sh = ActivePage.Shapes(i)
ActiveWindow.DeselectAll
ActiveWindow.Select Sh, visSelect
Next i
End Sub
Подскажите что не так. У меня Visio 2002
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 08/08/2006 :  22:26:06
Да все не так...
Должно быть примерно так:

Dim i As Integer
Private Sub CommandButton2_Click()
If i = 0 Then i = ActivePage.Shapes.Count
Set Sh = ActivePage.Shapes(i)
ActiveWindow.DeselectAll
ActiveWindow.Select Sh, visSelect
i = i - 1
End Sub

В зависимости от того, где у Вас кнопка, может быть придется перед запуском еще выключить Design Mode в меню Run.
Если кнопка сидит прямо на странице, то нужно бы еще сделать проверку, чтобы она сама не селектировалась. Или посадить ее последней, а считать начинать не с Count, а с Count-1.
Go to Top of Page

Bad_BoY

9 Posts

Posted - 08/09/2006 :  11:48:09
Всё работает :). Большое спасибо. Но как ещё при переходе сделать что бы я видел каждий шейп, тоесть что бы я перескакивая с одного шейпа на другой видел его(переводил фокус с одного шейпа на другой). И какой процедурой можно сделать переход с одной страницы на другую?

Edited by - Bad_BoY on 08/09/2006 12:40:38
Go to Top of Page

Bad_BoY

9 Posts

Posted - 08/14/2006 :  13:20:36
Переход с одной страницы на другую:
Private Sub CommandButton4_Click()
k = k + 1
ActiveWindow.Page = "Page-" + CStr(k)
End Sub
А вот первий вопрос пока не решил. И ещё как присвоить К страницу котороя сейчас активная?
Вот есть вот такое дело но оно почему то не работает:
Dim visDocument As Visio.Document
Dim iPagCtr As Integer
ActiveWindow.Page = visDocument.Pages(iPagCtr).Name

Edited by - Bad_BoY on 08/14/2006 15:10:17
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 08/14/2006 :  19:08:33
Я опять не понимаю вопроса.
В Visio нет ничего похожего на понятие "фокус".
Возможно Вам нужно передернуть рисунок так, чтобы селектированный шейп оказался в центре окна?
Тогда нужно пользоваться методом SetViewRect. Примерно, так:
ActiveWindow.SetViewRect Sh.Cells("PinX") - 10 / 2, Sh.Cells("PinY") + 10 / 2, 10, 10
Здесь я задал видимую область размером 10 дюймов и сказал, что левый край страницы должен начинаться в координате центра шейпа минус половина страницы. Верхний край страницы - координата шейпа плюс половина высоты страницы. При этом шейп окажется в центре.

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