Author |
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 " |
|
|
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 |
|
|
Tumanov
Russia
1198 Posts |
Posted - 08/03/2006 : 22:41:30
|
Visio экспортирует страницу, шейп или набор селектированных шейпов. Если Вы выделите на странице нужный блок шейпов (схему), и в выражении object.Export fileName в качестве объекта используете Selection, то оно и экспортируется. А вот с разрешением точно не помню - либо используются только установки по умолчанию, либо последние установки, использованные при ручном сохранении функцией Save As... Параметры при выызове метода не передаются. |
|
|
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 |
|
|
Tumanov
Russia
1198 Posts |
Posted - 08/05/2006 : 14:48:52
|
Вопрос совершено непонятен. Что Вы называете словом "переход"? Visio позволяет снять селектирование с одних шейпов, селектировать другие... Но при этом должен существовать какой-то критерий отбора шейпов, которые нужно селектировать. Например, если каждую Вашу "схему" сгруппировать, то на рисунке будет всего несколько шейпов-групп. Значит, селектируя их путем перебора, можно будет по очереди вывести все "схемы". |
|
|
Bad_BoY
9 Posts |
Posted - 08/05/2006 : 15:47:20
|
Я вот это и имел ввиду, у меня все схемы каждая по отдельности сгрупированы. Каким способом мне можно к примеру если у меня одна схема сейчас выделена снять с нее виделение и выделить следущую схему? |
|
|
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 |
|
|
Bad_BoY
9 Posts |
Posted - 08/07/2006 : 10:22:59
|
Я вешаю то что вы написали на кнопку но оно не работает. :( |
|
|
brace
Russia
358 Posts |
Posted - 08/07/2006 : 15:31:35
|
в визио 2003 есть макрорекордер он позволяет плучить макрос VBA действий юзера ... по созданию и удалению шейпов и др. |
|
|
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). |
|
|
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 |
|
|
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. |
|
|
Bad_BoY
9 Posts |
Posted - 08/09/2006 : 11:48:09
|
Всё работает :). Большое спасибо. Но как ещё при переходе сделать что бы я видел каждий шейп, тоесть что бы я перескакивая с одного шейпа на другой видел его(переводил фокус с одного шейпа на другой). И какой процедурой можно сделать переход с одной страницы на другую? |
Edited by - Bad_BoY on 08/09/2006 12:40:38 |
|
|
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 |
|
|
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. |
|
|
Topic |
|