Страница 1 из 1

Надо рисовать в Excell и знать координаты того что рисую.

Добавлено: 22 сен 2004, 08:26
patq
С уважением ко всем!
Подскажите! Как на листах Excell не только программно сформировать и прорисовывать объекты (кривые, плоскости, фигуры) но и программно узнать координаты любых точек этих объектов. Подскажите, может для этого есть стандартные библиотеки, либо надстройки, либо ….
Благодарен за любую информацию!

Добавлено: 22 сен 2004, 11:08
Naeel Maqsudov
Кажется это Вы задавали не так давно вопрос про сплайны, и координаты любых точек лежащих внутри сегментов кривой?

Так вот ситуация та же. Есть объект Shape, точнее есть интерфейс к COM-объекту Shape. Благодаря полиморфизму этот Shape может быть любой автофигурой MSOffice или иным внедренным в документ OLE-объектом. С другой стороны этот интерфейс НЕ ПОЗВОЛЯЕТ доступиться к данным о детялях самого объекта. А с третьей стороны сам этот объект реализует редакторы, которые позволяют работать с этим объектом интерактивно (перемещаемые мышью желтые маркеры у автофигур, свойства рисунка, или ассоциированное с OLE-объектом приложение).

Короче, программно с этими объектами можно делать только то, что позволяет Shape.

PS
Может я и поспешил с ответом... Сегодня-завтра еще раз все проверю на всякий случай, но думаю, что я абсолютно прав.

Надо рисовать

Добавлено: 23 сен 2004, 09:29
patq
Naeel Maqsudov писал(а):Кажется это Вы задавали не так давно вопрос про сплайны, и координаты любых точек лежащих внутри сегментов кривой?
. . .
Короче, программно с этими объектами можно делать только то, что позволяет Shape.
Доброго времени суток, ВСЕМ!
Да, это был я. И на тот вопрос я получил обстоятельный ответ, и с ним согласен.
Но проблема осталась и возникла мысль: можа кто-то где-то уже создал эти библиотеки, и их осталось взять и подключить к Excel. (Мечта любого нормального человека).

Ведь подобные задачи решены во многих конструкторских пакетах, должно же кого-то жизнь заставить доработать его под Excel.

С уважением, patq!

Добавлено: 29 сен 2004, 08:32
Naeel Maqsudov
можа кто-то где-то уже создал эти библиотеки
Будем надеяться. Может он и откликнется...
А Вы не смотрели, случайно, в AutoCAD-е нет ли такой возможности? Там точно такой же VBA используется.

Продолжение разговора о шейпах

Добавлено: 27 окт 2004, 13:36
AlexGur
Naeel!

Цитирую Ваши слова:
С другой стороны этот интерфейс НЕ ПОЗВОЛЯЕТ доступиться к данным о детялях самого объекта. А с третьей стороны сам этот объект реализует редакторы, которые позволяют работать с этим объектом интерактивно (перемещаемые мышью желтые маркеры у автофигур, свойства рисунка, или ассоциированное с OLE-объектом приложение).

Короче, программно с этими объектами можно делать только то, что позволяет Shape.
Из хелпа все же вытекает, что все-таки позволяет, но как-то криво и с оговорками. Вот пример. Я в Word визуально рисую Polyline (т.е. freeform), выделяю ее, после чего запускаю свой макрос, чтобы узнать координаты узлов. Код почти буквально скопирован из хелпа по Nodes, только вместо конкретного шейпа я обращаюсь к Selection:

Код: Выделить всё

Sub ListNodesCoords()
    Buf = ""
    For i = 1 To Selection.ShapeRange.Nodes.Count
        With Selection.ShapeRange.Nodes
            ptsArr = .Item(i).Points
            x = ptsArr(1, 1)
            y = ptsArr(1, 2)
            Buf = Buf & x & "," & y & Chr(13)
        End With
    Next i
    MsgBox (Buf)
End Sub
При запуске VBA выдает ошибку: Run-time error '13': Type mismatch и показывает ее в строке ptsArr = .Item(i).Points

Аналогичная манипуляция с Vertices вместо Nodes приводит к аналогичной ошибке.

Не понимаю, в чем тут дело. Дык есть ли доступ к координатам этой полилинии или нет?

С уважением, AlexGur.

Добавлено: 28 окт 2004, 04:13
AlexGur
Ну, короче, мой вопрос снят с повестки дня. Прошу прощения за глупость и наезд на Microsoft. Вот мой код (Freeform 39 уже должна быть нарисована, это у меня polyline):

Код: Выделить всё

Sub MyTest()
    buf = ""
    Set Nds = ActiveDocument.Shapes("Freeform 39").Nodes
    With Nds
        For i = 1 To Nds.Count
            pointsArray = .Item(i).Points
            currXvalue = pointsArray(1, 1)
            currYValue = pointsArray(1, 2)
            buf = buf & currXvalue & "," & currYValue & vbLf
        Next i
        MsgBox (buf)
    End With
End Sub

Добавлено: 02 ноя 2004, 01:52
Naeel Maqsudov
Naeel! Цитирую Ваши слова:
Цитата: [....skip....]
Из хелпа все же вытекает, что все-таки позволяет, но как-то криво и с оговорками.
Узлы в полигоне - это базовая инфомация об автофигуре (как ширина и высота у прямоугольника). Исходный вопрос был не об узлах, а о любых точках сплайна.

Добавлено: 02 ноя 2004, 02:49
AlexGur
Да, Наиль, спасибо, я это уже понял - потому и извинился перед участниками за глупый вопрос. Сейчас, кстати, именно этим (вычислением любых промежуточных точек) я и занимаюсь, но только для полилиний, т.е. ломаных.
Теоретически это можно научиться делать и для кривых Безье, но здесь надо покопаться в сплайновых алгоритмах (не так это и сложно; просто в мои задачи это не входит).