Форум пользователей Visio
http://visio.getbb.ru/

Чего нам и вам не хватает в стандартных средствах Visio ?
http://visio.getbb.ru/viewtopic.php?f=6&t=674
Страница 2 из 4

Автор:  Surrogate [ 14 ноя 2014, 18:50 ]
Заголовок сообщения:  Чего нам и вам не хватает в стандартных средствах Visio ?

Данная ветка является логическим продолжением дискуссии начатой чуть ранее.
9rey в сообщении #5717 писал(а):
вообще интересно, какие еще фишки людям хотелось бы добавить в визио? может например дотянуть линию до объекта? или обрезать? и т.п. :)
думаю удлинить/обрезать точно нужны!
кабы это еще все загнать в аддин, можно удостоиться упоминание самой Аллы Васильевой. Например так
Alla Vasilieva 11 Jun 2014 1:21 AM в русскоязычном блоге Visio писал(а):
Операции с «базовой точкой»
Во многих чертежных продуктах существуют так называемые операции с «базовой точкой». В частности, а AutoCad есть «копирование с базовой точкой», «перемещение с базовой точкой».
Данная операция может быть очень полезна для точного позиционирования вставляемого (перемещаемого) объекта.
Подробнее…
Так что есть куда копать.
Друзья поделитесь мнением чего вам не хватает, и если уже есть готовые "дополнительные возможности" дополняйте эту ветку.

Выделение секущей рамкой аля AutoCad
Таблицы в Visio
Работа с графами
Надстройка SelectShape, аналог QuickSelect в Autocad
Надстройка CopyProperties, копирование свойств шейпа

Автор:  Tumanov [ 17 ноя 2014, 09:53 ]
Заголовок сообщения:  Re: Чего нам и вам не хватает в стандартных средствах Visio ?

Цитата:
возможно что-то такое было в версии Technical

Насколько я помню, ничего особенного не было. Все эти варианты поставки являются лишь разными нарезками одних и тех же дополнений и трафаретов. В каждой версии их по разному нарезают. Но до 2013 ничего не выкидывалось. "Упрощать" Visio начали только в версии 2013.
Цитата:
но у меня специфика просто такая.
а вообще в автокаде то постоянно такое нужно.

9rey, я спрашивал на предмет - не удастся ли использовать имеющиеся средства Visio. К этой задаче близки две вещи: так называемое "расширение фигур" и функция IntersectX в шейп-листе. Они ведь как раз ищут точку пересечения продолжения линий. Если бы удалось приспособить то или другое, не надо было бы самим высчитывать все эти формулы и особые случаи типа деления на 0. Но вот к Вашему примеру вроде ни то, ни другое не клеится. Хотя, может это только на первый взгляд...

Автор:  9rey [ 17 ноя 2014, 10:09 ]
Заголовок сообщения:  Re: Чего нам и вам не хватает в стандартных средствах Visio ?

Tumanov, в моем случае я привязывался к определенным точкам подключения, их еще найти надо программно, и прочие мелочи.
а можно подробнее про "расширение фигур"?

Автор:  Surrogate [ 17 ноя 2014, 11:43 ]
Заголовок сообщения:  Re: Чего нам и вам не хватает в стандартных средствах Visio ?

у меня первая мысль была сделать так.
1. создать копию секущей линии
2. создать копию удлиняемой линии, удлинить ее до края листа в нужном
направлении (с поисками направления. дошел до геометрического решения
с линиями)
3. операцией трим, обрезать отрезок. найти точку пересечения (вот как не
придумал)
4. удлинить удлиняемую линию, до найденной точки пересечения.
5. удалить обрезки полученные в результате операции п. 3 (и это тоже вопрос)

Автор:  Surrogate [ 17 ноя 2014, 12:17 ]
Заголовок сообщения:  Re: Чего нам и вам не хватает в стандартных средствах Visio ?

MSDN в статье INTERSECTY Function писал(а):
INTERSECTY Function
Returns the y-coordinate (in the local coordinate system) of the point where two lines intersect. Each line is defined as a point (x,y) and an angle.

Syntax

INTERSECTX(x1,y1,angle1,x2,y2,angle2)
Remarks

Microsoft Office Visio uses this function in the PinY cell of a shape glued to a rotated guide.

If the lines don't intersect, the function returns a divide-by-zero error (#DIV/0!), which Visio ignores, restoring the last known value for the point.
по ходу это тоже будеть работать только с линиями (1-d) ?

Автор:  9rey [ 17 ноя 2014, 13:23 ]
Заголовок сообщения:  Re: Чего нам и вам не хватает в стандартных средствах Visio ?

Surrogate писал(а):
по ходу это тоже будеть работать только с линиями (1-d) ?

да, с коннекторами видимо не пройдет.
да и как прикрутить INTERSECTX? нам же не шейпшит нужен, а через код.

Автор:  Surrogate [ 17 ноя 2014, 13:28 ]
Заголовок сообщения:  Re: Чего нам и вам не хватает в стандартных средствах Visio ?

с помощью IntersectX и IntersectY можно вычислить координату пересечения пары линий средствами самого визио, а не писать код с геометрическими вычислениями как я

Автор:  9rey [ 17 ноя 2014, 14:37 ]
Заголовок сообщения:  Re: Чего нам и вам не хватает в стандартных средствах Visio ?

Surrogate писал(а):
с помощью IntersectX и IntersectY можно вычислить координату пересечения пары линий средствами самого визио, а не писать код с геометрическими вычислениями как я

это все понятно.
как ты себе представляешь инструмент, работающий на этих ф-ях? т.е. мне чтоб произвести обрезку/удлиннение надо каждый раз в эти линии пихать эти функции? а дальше как? вообще не очень представляю как это будет работать через шейпшит :)

Автор:  Surrogate [ 17 ноя 2014, 14:52 ]
Заголовок сообщения:  Re: Чего нам и вам не хватает в стандартных средствах Visio ?

для промежуточныъх вычислений используются ячейки User.IntersectX и User.IntersectY активного листа.
Код:
Sub Geometry_Base()
Dim f_sh As Shape, s_sh As Shape, I%
Dim wn As Window
Dim xpos$, ypos$, CH_X As Cell, CH_y As Cell
Set f_sh = ActiveWindow.Selection(1)
For I = 2 To ActiveWindow.Selection.Count
Set s_sh = ActiveWindow.Selection(I)
Dim x_cell As Cell, y_cell As Cell
Set wn = Application.ActiveWindow.Page.PageSheet.OpenSheetWindow
wn.Shape.Cells("user.intersecty").FormulaU = "=intersecty(sheet." & f_sh.ID & "!BeginX,sheet." & f_sh.ID & "!BeginY,sheet." & f_sh.ID & "!Angle,sheet." & s_sh.ID & "!BeginX,sheet." & s_sh.ID & "!BeginY,sheet." & s_sh.ID & "!Angle)"
y = wn.Shape.Cells("user.intersecty").Result(65)
wn.Shape.Cells("user.intersectx").FormulaU = "=intersectx(sheet." & f_sh.ID & "!BeginX,sheet." & f_sh.ID & "!BeginY,sheet." & f_sh.ID & "!Angle,sheet." & s_sh.ID & "!BeginX,sheet." & s_sh.ID & "!BeginY,sheet." & s_sh.ID & "!Angle)"
x = wn.Shape.Cells("user.intersectx").Result(65)
wn.Close
' x и y найденные точки пересечения
If s_sh.Cells("EndX").Result(65) - x < s_sh.Cells("BeginX").Result(65) - x Then
Set CH_X = s_sh.Cells("EndX")
Set CH_y = s_sh.Cells("Endy")
Else
Set CH_X = s_sh.Cells("BeginX")
Set CH_y = s_sh.Cells("Beginy")
End If
xpos = Replace(x & " mm", ",", ".")
ypos = Replace(y & " mm", ",", ".")
CH_X.FormulaU = xpos
CH_y.FormulaU = ypos
Next I
End Sub

костыль конечно :)

Автор:  Tumanov [ 17 ноя 2014, 19:37 ]
Заголовок сообщения:  Re: Чего нам и вам не хватает в стандартных средствах Visio ?

Ой, а у меня буковок меньше получилось.. :)
Код:
Dim sh1 As Visio.Shape, sh2 As Visio.Shape
Sub ttt()
    Set sh1 = ActiveWindow.Selection(1): Set sh2 = ActiveWindow.Selection(2)
    With ActivePage.PageSheet
        .Cells("Scratch.X1") = sh1.Cells("BeginX")
        .Cells("Scratch.Y1") = sh1.Cells("BeginY")
        .Cells("Scratch.A1") = sh1.Cells("Angle")
        .Cells("Scratch.X2") = sh2.Cells("BeginX")
        .Cells("Scratch.Y2") = sh2.Cells("BeginY")
        .Cells("Scratch.A2") = sh2.Cells("Angle")
        sh2.Cells("EndX") = .Cells("Scratch.X3")
        sh2.Cells("EndY") = .Cells("Scratch.Y3")
    End With
End Sub

Это потому, что я саму формулу заранее в шейп-лист запихал :)

Автор:  Tumanov [ 17 ноя 2014, 19:40 ]
Заголовок сообщения:  Re: Чего нам и вам не хватает в стандартных средствах Visio ?

Цитата:
костыль конечно

Для общего случая - да.
Но представьте себе, что кому-то понадобится линия, которая может "дотягиваться" куда надо. Вот тогда Intersect может очень даже пригодиться.
Потому я и интересовался, для какого применения это нужно.
Цитата:
а можно подробнее про "расширение фигур"?

Это они так на русский Shape Extensions перевели.
Если в Visio включить нужные галочки, то из шейпов начинают всякие пуктирные линии расти. Как я понимаю, этим пользуются редко, потому как чаще всего они только раздражают. Но пересечения находят.
Примерно вот так. https://www.dropbox.com/s/un9qdiukk3iti ... n.avi?dl=0

Автор:  Surrogate [ 17 ноя 2014, 19:57 ]
Заголовок сообщения:  Re: Чего нам и вам не хватает в стандартных средствах Visio ?

Tumanov писал(а):
Это они так на русский Shape Extensions перевели.
Если в Visio включить нужные галочки, то из шейпов начинают всякие пуктирные линии расти. Как я понимаю, этим пользуются редко, потому как чаще всего они только раздражают. Но пересечения находят.
А программно-то это как можно использовать ?
с помощью этой фичи можно руками дотянуть линию, до нужного места.
а фича из автокада позволяет дотянуть до "секущей" линии (той линии что была выбрана первой) сразу несколько линий!
Изображение

Автор:  Tumanov [ 17 ноя 2014, 20:17 ]
Заголовок сообщения:  Re: Чего нам и вам не хватает в стандартных средствах Visio ?

То есть нужно именно то, что на этой картинке?
Кстати, а что происходит, когда расширяющаяся линия не встретит цели? Уходит в край листа?

Автор:  Surrogate [ 17 ноя 2014, 20:37 ]
Заголовок сообщения:  Re: Чего нам и вам не хватает в стандартных средствах Visio ?

ничего не происходит ! если пересечения не произойдет в пределах активной области просмотра.
в автокаде есть 3 операции Обрезать/Удлинить/Сопряжение

Обрезать
Удлинить
Сопряжение
Изображение
Изображение
Изображение


вот как раз Сопряжение продлит обе линии до точки их пересечения

Автор:  Tumanov [ 17 ноя 2014, 20:42 ]
Заголовок сообщения:  Re: Чего нам и вам не хватает в стандартных средствах Visio ?

Уж не хотите ли Вы перенести в Visio весь этот тулбар? :)

Автор:  Surrogate [ 17 ноя 2014, 20:46 ]
Заголовок сообщения:  Re: Чего нам и вам не хватает в стандартных средствах Visio ?

нет. это уже перебор будет :)

Автор:  9rey [ 17 ноя 2014, 21:19 ]
Заголовок сообщения:  Re: Чего нам и вам не хватает в стандартных средствах Visio ?

Tumanov, Surrogate, красавцы! благодаря вам узнал о двух классных фичах: о "расширениях фигур" и в автокаде "сопряжение"! буду активно пользоваться :D

Автор:  Tumanov [ 18 ноя 2014, 13:27 ]
Заголовок сообщения:  Re: Чего нам и вам не хватает в стандартных средствах Visio ?

Можно попробовать вот такой прием:
Код:
Dim WithEvents pg As Visio.Page
Dim Garbage As Collection

Dim sh1 As Visio.Shape, sh2 As Visio.Shape
Dim sh3 As Visio.Shape, sh4 As Visio.Shape

Sub ttt()
    Set Garbage = New Collection
    Set pg = ActivePage     'Включить сбор мусора
    Set sh1 = ActiveWindow.Selection(1)
    Set sh2 = ActiveWindow.Selection(2)
    Set sh3 = sh1.Duplicate     'Дубль границы (цели)
    sh3.Cells("PinX") = sh1.Cells("PinX")
    sh3.Cells("PinY") = sh1.Cells("PinY")
    'Направляющая накрывает продлеваемую линию
    Set sh4 = ActivePage.AddGuide(2, sh2.Cells("PinX"), sh2.Cells("PinY"))
    sh4.Cells("Angle") = sh2.Cells("Angle")
    ActiveWindow.Selection.DeselectAll
    ActiveWindow.Select sh3, visSelect
    ActiveWindow.Select sh4, visSelect
    Dim sel As Visio.Selection
    Set sel = ActiveWindow.Selection
    sel.Trim    'Собственно разрез
    '(Созданные в процессе разреза шейпы соберутся в коллекцию Garbage)
    Set pg = Nothing     'Останов сбора мусора
    Debug.Print Garbage.Count
    'Удаление из коллекции шейпов, которые Visio уже удалил
    For i = Garbage.Count To 1 Step -1
        On Error Resume Next
        If Garbage(i).Type <> 3 Then Garbage.Remove i
        On Error GoTo 0
    Next
    Debug.Print Garbage.Count
    'Определение точки соединения по стыку фрагментов
    Select Case Garbage.Count
    Case 1  'Направляющая прошла мимо цели
        MsgBox "Нет пересечения"
    Case 2  'Цель рассечена надвое
        If (Garbage(1).Cells("BeginX") - Garbage(2).Cells("EndX")) < 0.001 _
        And (Garbage(1).Cells("BeginY") - Garbage(2).Cells("EndY")) < 0.001 Then
            x = Garbage(1).Cells("BeginX")
            y = Garbage(1).Cells("BeginY")
        Else    'Смотря какими концами стыкуются отрезки
            x = Garbage(1).Cells("EndX")
            y = Garbage(1).Cells("EndY")
        End If
        Set sh4 = ActivePage.AddGuide(1, x, y)
    Case Else  'Слишком много пересечений
        MsgBox "Слишком много пересечений"
    End Select
    'Удаление мусора
    On Error Resume Next
    For i = Garbage.Count To 1 Step -1
        Garbage(i).Delete   'Удаление рассеченного шейпа
        Garbage.Remove i    'Чистка коллекции
    Next
    On Error GoTo 0
    'Примечание. Направляющая в точке пересечения остается не удаленной.
End Sub

Private Sub pg_ShapeAdded(ByVal Shape As IVShape)
    Garbage.Add Shape
End Sub

Автор:  Tumanov [ 18 ноя 2014, 13:33 ]
Заголовок сообщения:  Re: Чего нам и вам не хватает в стандартных средствах Visio ?

Точка пересечения прямой и цели (прямая, кривая, ломаная) находится по реальному пересечению временных технологических шейпов - дубля цели и направляющей, накладываемой на прямую.
Цель разрежется на 2 части (не всегда). Точка пересечения будет там, где начало одного фрагмента совпадет с концом другого (по координатам).
Весь технологический мусор собирается в специальную коллекцию, потом удаляется.
Коллекция собирается в событии добавления шейпа на страницу.

Автор:  Surrogate [ 18 ноя 2014, 13:52 ]
Заголовок сообщения:  Re: Чего нам и вам не хватает в стандартных средствах Visio ?

Геннадий,
великолепно, осталось только нужный конец второго выделенного шейпа довести до sh4 Изображение

Автор:  Tumanov [ 18 ноя 2014, 17:44 ]
Заголовок сообщения:  Re: Чего нам и вам не хватает в стандартных средствах Visio ?

Немножко подчистил
Код:
Dim WithEvents pg As Visio.Page 'Страница, обслуживающая событие ShapeAdded
Dim Garbage As Collection       'Коллекция для сбора технологического мусора

'Обработчик технологического мусора
Private Sub pg_ShapeAdded(ByVal Shape As IVShape)
    Garbage.Add Shape
End Sub

Sub ttt()   'Тестовая процедура для LineExtension
    LineExtension ActiveWindow.Selection(1), ActiveWindow.Selection(2)
End Sub

'Процедура продления прямой Line до линии Targ
Sub LineExtension(Targ As Visio.Shape, Line As Visio.Shape)
    Dim sh3 As Visio.Shape, sh4 As Visio.Shape
    Dim Flag As Integer
    Set Garbage = New Collection
    Set pg = ActivePage     'Включить сбор мусора
    Set sh3 = Targ.Duplicate     'Дубль границы (цели)
    sh3.Cells("PinX") = Targ.Cells("PinX")
    sh3.Cells("PinY") = Targ.Cells("PinY")
    'Направляющая накрывает продлеваемую линию
    Set sh4 = ActivePage.AddGuide(2, Line.Cells("PinX"), Line.Cells("PinY"))
    sh4.Cells("Angle") = Line.Cells("Angle")
    With ActiveWindow
        .Selection.DeselectAll
        .Select sh3, visSelect
        .Select sh4, visSelect
        .Selection.Trim    'Собственно разрез
    End With
    '(Созданные в процессе разреза шейпы соберутся в коллекцию Garbage)
    Set pg = Nothing     'Останов сбора мусора
'    Debug.Print Garbage.Count
    'Удаление из коллекции шейпов, которые Visio уже удалил
    For i = Garbage.Count To 1 Step -1
        On Error Resume Next
        If Garbage(i).Type <> 3 Then Garbage.Remove i
        On Error GoTo 0
    Next
'    Debug.Print Garbage.Count
    'Определение точки соединения по стыку фрагментов
    Flag = 0    'Признак нештатной ситуации при определении пересечения
    Select Case Garbage.Count
    Case 1  'Направляющая прошла мимо цели
        MsgBox "Нет пересечения"
    Case 2  'Цель рассечена надвое
        If (Garbage(1).Cells("BeginX") - Garbage(2).Cells("EndX")) < 0.001 _
        And (Garbage(1).Cells("BeginY") - Garbage(2).Cells("EndY")) < 0.001 Then
            x = Garbage(1).Cells("BeginX")
            y = Garbage(1).Cells("BeginY")
        Else    'Смотря какими концами стыкуются отрезки
            x = Garbage(1).Cells("EndX")
            y = Garbage(1).Cells("EndY")
        End If
        Flag = 1
'        Set sh4 = ActivePage.AddGuide(1, x, y)
    Case Else  'Слишком много пересечений
        MsgBox "Слишком много пересечений"
        'Тут еще нужно решить, что делать.
    End Select
    'Удаление мусора
    On Error Resume Next
    For i = Garbage.Count To 1 Step -1
        Garbage(i).Delete   'Удаление рассеченного шейпа
        Garbage.Remove i    'Чистка коллекции
    Next
    On Error GoTo 0
    If Flag = 0 Then Exit Sub   'Нет возможности продлить линию.
    'Продление линии до точки x, y
    If Abs(Line.Cells("BeginX") - Line.Cells("EndX")) > 0 Then
        a = x: b = Line.Cells("BeginX"): c = Line.Cells("EndX")
    Else
        a = y: b = Line.Cells("BeginY"): c = Line.Cells("EndY")
    End If
    Flag = 0
    If b < c Then   'Стрелка вверх или вправо
        If a < b Then
            Flag = 1
        ElseIf a > c Then
            Flag = 2
        End If
    Else
        If a < c Then
            Flag = 2
        ElseIf a > b Then
            Flag = 1
        End If
    End If
    If Flag = 1 Then
        Line.Cells("BeginX") = x: Line.Cells("BeginY") = y
    ElseIf Flag = 2 Then
        Line.Cells("EndX") = x: Line.Cells("EndY") = y
    End If
End Sub

Страница 2 из 4 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/