Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 FoxPro + Microsoft Visio  [new]
AngelOKES
Member

Откуда: Россия г.Оренбург
Сообщений: 349
Много чего тут перерыл, многие совсем не хотят работать из-за стоимости, но реальных примеров работы с Visio я так и не смог найти.
Задача стоит такая:
1)подключиться к документы (выполнено)
2)открыть его в фоксе для визуального просмотра с инструментами Visio для масштабирования (выполнено)
3)необходимо найти объекты в документе и выделить их другим цветом (в разработке, не могу понять как обратиться к этим объектам и можно ли это сделать в принципе)
4)дорисовать что-нибудь в текущий документ и сохранить документ!

Может кто уже сталкивался с этим, мне бы маленький примерчик, дальше я сам
24 авг 15, 10:26    [18058582]     Ответить | Цитировать Сообщить модератору
 Re: FoxPro + Microsoft Visio  [new]
Ffffffffffffff
Guest
ActiveDocument.Pages(1).Shapes(1)...
24 авг 15, 17:52    [18060824]     Ответить | Цитировать Сообщить модератору
 Re: FoxPro + Microsoft Visio  [new]
AngelOKES
Member

Откуда: Россия г.Оренбург
Сообщений: 349
Ffffffffffffff
ActiveDocument.Pages(1).Shapes(1)...


Нет у меня такого, Page могу найти активный, но дальше к нему обратиться не получается, максимум что могу вытянуть это его имя и имя слоя
25 авг 15, 07:51    [18062382]     Ответить | Цитировать Сообщить модератору
 Re: FoxPro + Microsoft Visio  [new]
sg12
Member

Откуда:
Сообщений: 454
AngelOKES

Объектную модель вам нужно найти подробную, и коды из того, что вам нужно, перевести в VFP в класс и по частям отладить.
25 авг 15, 08:24    [18062435]     Ответить | Цитировать Сообщить модератору
 Re: FoxPro + Microsoft Visio  [new]
AngelOKES
Member

Откуда: Россия г.Оренбург
Сообщений: 349
sg12, Нашёл я способ обратится к элементам документа, через thisform.myVisio.ShapeName(1)
Всего элементов в документе: thisform.myVisio.ShapeCount
Только это мне в итоге не очень помогло, те кто создавал этот документ называл элементы как попало
25 авг 15, 08:46    [18062488]     Ответить | Цитировать Сообщить модератору
 Re: FoxPro + Microsoft Visio  [new]
AngelOKES
Member

Откуда: Россия г.Оренбург
Сообщений: 349
AngelOKES, И всё равно нет возможно как-то изменить элемент, например изменить цвет или перечеркнуть его
25 авг 15, 08:47    [18062496]     Ответить | Цитировать Сообщить модератору
 Re: FoxPro + Microsoft Visio  [new]
sg12
Member

Откуда:
Сообщений: 454
AngelOKES

Не разобравшись с объектной моделью, вы так и будете тыкаться с каждым свойством, а их сотни.
25 авг 15, 09:13    [18062609]     Ответить | Цитировать Сообщить модератору
 Re: FoxPro + Microsoft Visio  [new]
AngelOKES
Member

Откуда: Россия г.Оренбург
Сообщений: 349
sg12
AngelOKES

Не разобравшись с объектной моделью, вы так и будете тыкаться с каждым свойством, а их сотни.


Ну а как мне в ней разобраться? Документации как таковой нет, вот и делаем как привыкли тыкаемся и пробуем...
Я бы не отказался бы от нормальной документации
25 авг 15, 09:16    [18062627]     Ответить | Цитировать Сообщить модератору
 Re: FoxPro + Microsoft Visio  [new]
sg12
Member

Откуда:
Сообщений: 454
AngelOKES

Наберите в гугле "Объектная модель MS Visio" и начните ее изучать.
Описания и нужные вам коды вы найдете на каком-нибудь другом языке.
Разобравшись, переложить на VFP по аналогии с Word и Excel не так уж проблематично.
25 авг 15, 09:30    [18062720]     Ответить | Цитировать Сообщить модератору
 Re: FoxPro + Microsoft Visio  [new]
AngelOKES
Member

Откуда: Россия г.Оренбург
Сообщений: 349
sg12, Мне бы ещё разобраться как работать :)

Сейчас решил, что SDK недостаточно и поставил полноценный Visio 2003, так теперь фокс совсем не хочет работать c OLE
25 авг 15, 10:15    [18062943]     Ответить | Цитировать Сообщить модератору
 Re: FoxPro + Microsoft Visio  [new]
Fffffffffffffff
Guest
Vs=CreateObject("Visio.Application")

не работает?
25 авг 15, 10:56    [18063228]     Ответить | Цитировать Сообщить модератору
 Re: FoxPro + Microsoft Visio  [new]
AngelOKES
Member

Откуда: Россия г.Оренбург
Сообщений: 349
Fffffffffffffff
Vs=CreateObject("Visio.Application")

не работает?


Сейчас уже заработало, а вот OLE что-то тупит, мне же желательно загрузить и отобразить...

делаю

sz=CREATEOBJECT("Visio.Application")
sz.Documents.Add(GETFILE('*.vsd'))

Он мне открывает этот документ... вообщем буду разбираться... тяжко очень...
25 авг 15, 11:45    [18063597]     Ответить | Цитировать Сообщить модератору
 Re: FoxPro + Microsoft Visio  [new]
AngelOKES
Member

Откуда: Россия г.Оренбург
Сообщений: 349
sg12
AngelOKES

Наберите в гугле "Объектная модель MS Visio" и начните ее изучать.
Описания и нужные вам коды вы найдете на каком-нибудь другом языке.
Разобравшись, переложить на VFP по аналогии с Word и Excel не так уж проблематично.


Сделал как вы сказали, ничего путного, элементарные вещи объяснены и всё, ни одного примера реализации...
25 авг 15, 11:51    [18063646]     Ответить | Цитировать Сообщить модератору
 Re: FoxPro + Microsoft Visio  [new]
Ffffffffffff
Guest
ActiveDocument.Pages(1).Shapes(1).DrawLine(a, b, c, d)
25 авг 15, 12:55    [18064162]     Ответить | Цитировать Сообщить модератору
 Re: FoxPro + Microsoft Visio  [new]
AngelOKES
Member

Откуда: Россия г.Оренбург
Сообщений: 349
Ffffffffffff
ActiveDocument.Pages(1).Shapes(1).DrawLine(a, b, c, d)


Спасибо, уже пошло! Пока вопросов нет, немного стал разбираться, как закончу выложу код!!!
25 авг 15, 13:25    [18064377]     Ответить | Цитировать Сообщить модератору
 Re: FoxPro + Microsoft Visio  [new]
AngelOKES
Member

Откуда: Россия г.Оренбург
Сообщений: 349
Выкладываю как и обещал код программы:

1) Открывается форма и кнопка выбора файла:

 
 ***  Для отображения используется компонент ActivX обычный просмоторщик Visio, полноценный я так и не нашёл  
 ***  А для програмирования уже создаю объект на основе Visio.Application  
  With Thisform  
  	mFile=Getfile('vsd')                                             && Получение файла с нужным расширением  
  	If Upper(Allt(.MyFisio.srC))==Upper(Allt(mFile))                 && Проверка выбранного файла и то, что уже загружено в OLE  
  	Else  
  		If Len(Allt(.MyFisio.srC))=0                                   && Если загрузка впервые  
  			answer=6  
  		Else  
  			answer=Messagebox('?Перезагрузить файл ?',36,'Вопрос')    
  		Endif  
  		If answer=6  
  			.MyFisio.Unload                                              && Выгружаем, то что есть на данный моментв OLE  
  			.MyFisio.Load(Allt(mFile))                                   && Загружаем выбранный файл (Процесс долгий, зависит от файла, может грузить секунд 30)  
  			.MyFisio.Object.PageVisible = .T.                            && делаю видимой страницу, хотя можно и убрать, сомнительно что это нужно, просто есть проблемы с отрисовкой и эта строчка вроде как помогла  
  			mkod=Thisform.MyFisio.Object.CurrentPageIndex                && Текущая страница документа  
  			mkodMax=Thisform.MyFisio.Object.PageCount                    && Всего страниц в документе  
  			mShapeCount=Thisform.MyFisio.Object.ShapeCount               && Количество элементов на странице (В данном случае пользователю это не нужно, но я отображаю для наглядности)  
  			.tkod.Value=mkod  
  			.tFile.Value=mFile  
  			.linfo.Caption = 'Страница '+Allt(Str(mkod))+' из '+Allt(Str(mkodMax))+' Всего элементов на странице: '+Allt(Str(mShapeCount))  
  		Endif  
  	Endif  
  Endwith


2) Теперь поиск элемента и его видоизменение двумя разными способами


 Local VisApp As Visio.Application  
  Local VisDoc As Visio.Document  
 ******************************************************  константы  ***************************************************************  
  visSectionObject=1  
  visRowFill=3  
  visFillForegnd=0  
  visFillForegndTrans=6  
  visFillBkgndTrans=7  
  visFillPattern=2  
  visSectionCharacter=3  
  visCharacterSize = 7  
  visFitWidth = 2  
 **********************************************************************************************************************************  
  mkod=Thisform.tkod.Value        && страница  
  mtp=Allt(Thisform.ttp.Value)    && то что ищем  
  mFile=Thisform.tFile.Value      && выбранный файл  
 *****************************  создаем курсор для хранения всех объектов страницы  ************************************************  
  Create Cursor MyOb (NomerS1 Int, NomerS2 Int, mid Int, NameS Varchar(50), tText Varchar(50))  
  If File(mFile)  
  	VisApp=Createobject("Visio.Application")              	&& Создаем экземпляр объекта  
  	VisApp.Visible=.F.                                    	&& Делаем его невидимым  
  	VisDoc=VisApp.Documents.Open(mFile)                   	&& Открываем в нём наш документ  
  	VisApp.ActiveWindow.Page = VisDoc.Pages(mkod)         	&& Переходим на нужную страницу (хотя данный кусок кода мне уже не нужен, сделал там другую фишку)  
  	VisApp.ActiveWindow.ViewFit = visFitWidth             	&& По ширине экрана  
  	pagObj = VisApp.ActivePage                            	&& Переменная активной страницы  
  	For i=1 To pagObj.Shapes.Count Step 1                 	&& Открываем первый цикл по всем элементам Shapes  
  		If pagObj.Shapes(i).Shapes.Count>1                  	&& Если у Shapes есть свои Shapes  
  			For i2=1 To pagObj.Shapes(i).Shapes.Count Step 1  	&& Если есть, то открываем второй цикл по Shapes.Shapes  
  				Insert Into MyOb (NomerS1, NomerS2, mid, NameS, tText) Values (i, i2, pagObj.Shapes(i).Shapes(i2).Id, ;  
  					pagObj.Shapes(i).Shapes(i2).Name, pagObj.Shapes(i).Shapes(i2).Text)  
  			Endfor  
  		Else  
  			Insert Into MyOb (NomerS1, NomerS2, mid, NameS, tText) Values (i, 0, pagObj.Shapes(i).Id, ;  
  				pagObj.Shapes(i).Name, pagObj.Shapes(i).Text)  
  		Endif  
  	Endfor  
  	Thisform.cUp.Caption ='Найти и выделить ТП ('+Allt(Str(Reccount('q1')))+')'  
  	Select * From MyOb Where Like('*ТП*',tText) And Like('* '+mtp+' *',tText) Into Cursor q1   && Здесь я делаю свою выборку и если она не удачна, то делаю другую  
  	If Reccount('q1')<>0  
  		If Reccount('q1')>1  
  			Messagebox('Найдено '+Allt(Str(Reccount('q1')))+' элементов на схеме, удовлетворяющим условиям',32,'Оповещение')  
  		Endif  
  		Select q1  
  		Scan  
 			****  здесь я просто меняю цвет, но можно сделать почти всё, что захочется  
  			VisApp.ActiveWindow.Page.Shapes.ItemFromID(mid).CellsSRC(visSectionObject, visRowFill, visFillForegnd).FormulaU = "THEMEGUARD(RGB(0,176,240))"    
  		Endscan  
  	Else  
  		Select * From MyOb Where tText==mtp Into Cursor q2  
  		If Reccount('q2')=0  
  			Messagebox('Элементы на схеме, удовлетворяющим условиям не найдены',32,'Оповещение')  
  		Else  
  			If Reccount('q2')>1  
  				Messagebox('Найдено '+Allt(Str(Reccount('q2')))+' элементов на схеме, удовлетворяющим условиям',32,'Оповещение')  
  			Endif  
  			Select q2  
  			Scan  
 				****  здесь я просто размер шрифта, возможностей достаточно много  
  				VisApp.ActiveWindow.Page.Shapes.ItemFromID(mid).CellsSRC(visSectionCharacter, 0, visCharacterSize).FormulaU = "30 pt"  
  			Endscan  
  		Endif  
  	Endif  
  	VisDoc.SaveAs('c:\1.vsd')   								&& пересохраняем в другой файл  
  	VisApp.Quit                 								&& вроде бы так освобождаю объект  
  	Thisform.MyFisio.Unload     								&& выгружаю OLE  
  	Thisform.MyFisio.Load('c:\1.vsd')   				&& загружаю в OLE изменённый файл, оригинал не трогаем  
  	Thisform.MyFisio.Object.PageVisible = .T.   && делаю страницу видимой (под вопросм, нужло лии это я описал в первой процедуре)  
  	Messagebox('Загрузка файла закончена, нажмите ОК для продолжения',32,'Оповещение')  
  	Thisform.Refresh                            && обновляю форму и на всякий случай сам OLE, но всё равно бывают проблемы не прорисовки  
  	Thisform.MyFisio.Refresh  
  Else  
  	Messagebox('Файл не найден',32,'Оповещение')  
  Endif


3) С самим OLE почти ничего сделать нельзя, единственное что я сделал это на событие OnPageChanged


*** ActiveX Control Event ***  
  Lparameters pageindex  
  mkod=pageindex  
  Thisform.tkod.Value=mkod  
  mkodMax=Thisform.MyFisio.Object.PageCount  
  mShapeCount=Thisform.MyFisio.Object.ShapeCount  
  Thisform.linfo.Caption = 'Страница '+Allt(Str(mkod))+' из '+Allt(Str(mkodMax))+' Всего элементов на странице: '+Allt(Str(mShapeCount))  
  Thisform.Refresh



Работает медленно, но в принципе в пределах разумного, проблема есть в обновление OLE, не всегда он обновляет, может просто висеть пустое место, тронешь на нём мышкой и тогда всё отображает, но сейчас почему-то перестало глючить, с чем связано не понятно.
Хотелось бы конечно как-то перерисовывать OLE без перезагрузки, но думаю что для этого нужен какой-нибудь другой OLE.
27 авг 15, 13:30    [18076284]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить