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

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
patq
Сообщения: 32
Зарегистрирован: 22 апр 2004, 07:50
Откуда: г. Ижевск

С уважением ко всем!
Подскажите! Как на листах Excell не только программно сформировать и прорисовывать объекты (кривые, плоскости, фигуры) но и программно узнать координаты любых точек этих объектов. Подскажите, может для этого есть стандартные библиотеки, либо надстройки, либо ….
Благодарен за любую информацию!
Идущий, да осилит дорогу!
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Кажется это Вы задавали не так давно вопрос про сплайны, и координаты любых точек лежащих внутри сегментов кривой?

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

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

PS
Может я и поспешил с ответом... Сегодня-завтра еще раз все проверю на всякий случай, но думаю, что я абсолютно прав.
patq
Сообщения: 32
Зарегистрирован: 22 апр 2004, 07:50
Откуда: г. Ижевск

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

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

С уважением, patq!
Идущий, да осилит дорогу!
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

можа кто-то где-то уже создал эти библиотеки
Будем надеяться. Может он и откликнется...
А Вы не смотрели, случайно, в AutoCAD-е нет ли такой возможности? Там точно такой же VBA используется.
AlexGur
Сообщения: 5
Зарегистрирован: 27 окт 2004, 13:00
Откуда: Из Маасквы

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.
AlexGur
Сообщения: 5
Зарегистрирован: 27 окт 2004, 13:00
Откуда: Из Маасквы

Ну, короче, мой вопрос снят с повестки дня. Прошу прощения за глупость и наезд на 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
С уважением, AlexGur.
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Naeel! Цитирую Ваши слова:
Цитата: [....skip....]
Из хелпа все же вытекает, что все-таки позволяет, но как-то криво и с оговорками.
Узлы в полигоне - это базовая инфомация об автофигуре (как ширина и высота у прямоугольника). Исходный вопрос был не об узлах, а о любых точках сплайна.
AlexGur
Сообщения: 5
Зарегистрирован: 27 окт 2004, 13:00
Откуда: Из Маасквы

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