Подскажите программно узнать координаты кривой
Модератор: Naeel Maqsudov
Как программно узнать или вставить точку в сформированную кривую, если задавать одну координату.
Кривая создаю следующими командами:
With ActiveSheet.Shapes.BuildFreeform(msoEditingAuto, 40, 45)
AddNodes msoSegmentCurve, msoEditingAuto, 140, 145
AddNodes msoSegmentCurve, msoEditingAuto, 160, 80
‘ закроем линию и присвоим ей имя
.ConvertToShape.Name = "Proba"
End With
Программно знаю как вставить точку по двум координатам
ActiveSheet.Shapes("Proba").Nodes.Insert 1, msoSegmentCurve, msoEditingAuto, 160, 200
П :?: одскажите как задать координату по оси X/Y и узнать координату по оси Y/X, лежащую на кривой.
На худой конец как вставить точку в кривую, задавая одну координату
Кривая создаю следующими командами:
With ActiveSheet.Shapes.BuildFreeform(msoEditingAuto, 40, 45)
AddNodes msoSegmentCurve, msoEditingAuto, 140, 145
AddNodes msoSegmentCurve, msoEditingAuto, 160, 80
‘ закроем линию и присвоим ей имя
.ConvertToShape.Name = "Proba"
End With
Программно знаю как вставить точку по двум координатам
ActiveSheet.Shapes("Proba").Nodes.Insert 1, msoSegmentCurve, msoEditingAuto, 160, 200
П :?: одскажите как задать координату по оси X/Y и узнать координату по оси Y/X, лежащую на кривой.
На худой конец как вставить точку в кривую, задавая одну координату
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Можно только двигать/добавлять/удалять узлы у данного ShapeObject через его коллекцию Nodes.
При добавлении узла всегда указываются обе его координаты. Эта операция предназначена для изменения формы кривой. Если же Вы хотите вычислить координаты точек не в узлах, а посередине сегмента, то увы, это недоступная информация. Не у объектов Shape и BuildFreeForm, ни даже у функций функций WinAPI (Line and Curve Functions) нет такой возможности, так как информация о точках из которых состоит сегмент кривой используется только в момент рисования сегмента кривой в контексте устройства (Device Context)
При добавлении узла всегда указываются обе его координаты. Эта операция предназначена для изменения формы кривой. Если же Вы хотите вычислить координаты точек не в узлах, а посередине сегмента, то увы, это недоступная информация. Не у объектов Shape и BuildFreeForm, ни даже у функций функций WinAPI (Line and Curve Functions) нет такой возможности, так как информация о точках из которых состоит сегмент кривой используется только в момент рисования сегмента кривой в контексте устройства (Device Context)
Обидно, ох как обидно
Идущий, да осилит дорогу!
:?: Ой ли ведь Excell, в режиме добавки точек в кривую, меняет вид маркера при подводе его к этой кривой.Naeel Maqsudov писал(а):Если же Вы хотите вычислить координаты точек не в узлах, а посередине сегмента, то увы, это недоступная информация. .... так как информация о точках из которых состоит сегмент кривой используется только в момент рисования сегмента кривой в контексте устройства (Device Context)
Откуда ж он это узнает, откуда эти координаты берет.
И почему нам не дает? Что, рылом не вышли?
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Курсор-то меняется, но работа редакторов графических объектов MSOffice к VBA никакого отношения не имеет. У самого же графического объекта нет ни свойст ни методов, чтобы сделать то что Вы хотите. Так что увы... И не в рыле дело... 

Да, в методах и свойствах графических объектов, я также не нашел выхода на координаты. Это и послужило причиной обратиться к спецам.Naeel Maqsudov писал(а):Курсор-то меняется, но работа редакторов графических объектов MSOffice к VBA никакого отношения не имеет. У самого же графического объекта нет ни свойст ни методов, чтобы сделать то что Вы хотите. )
Но координаты линий MSOffice при каждом обращении к линии вычисляет/знает. Зачем же писать программу для их вычисления.
- относится к разработчикам Microsoft Office. Причина таковога: когда то давным-давно я решал подобную проблему. И в документации было описано решение, но не работало оно у меня. Я, описав проблему и предлагаемое документацией решение, обратился к разработчикам на их сайт. Ответили быстро, чему я обрадовался. Но прочитаное возмутило, там было вежлива написано: "Читай документацию".patq писал(а): Фраза из моего письма: "И почему нам не дает? Что, рылом не вышли?" )
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Печально...
Однако, разработчики часто любят держать свои решения в секрете.
Т.е. есть COM-объект, который рисует гладкие кривые через заданные вершины (входними данными для него являются координаты вершин, выходными - линия в контексте устройства); есть другой объект который рисует линии. Входными данными для его функционирования являются клики и перемешения курсора мыши, а выходными - набор вершин.
Ваша задача совсем другая. Ни один из этих объектов не может по входным данным - набору вершин - выдавать координаты любой точки любого сегмента.
Выход: писать самому или искать что-то готовое.
Однако, разработчики часто любят держать свои решения в секрете.
Хотелось бы не писать, но увы, воспользоваться результатами написанного нельзя.Но координаты линий MSOffice при каждом обращении к линии вычисляет/знает. Зачем же писать программу для их вычисления.
Т.е. есть COM-объект, который рисует гладкие кривые через заданные вершины (входними данными для него являются координаты вершин, выходными - линия в контексте устройства); есть другой объект который рисует линии. Входными данными для его функционирования являются клики и перемешения курсора мыши, а выходными - набор вершин.
Ваша задача совсем другая. Ни один из этих объектов не может по входным данным - набору вершин - выдавать координаты любой точки любого сегмента.
Выход: писать самому или искать что-то готовое.