×××××求一点关于另一点旋转N度得坐标算法××××××(解决问题200分) (200分)

  • 主题发起人 主题发起人 duhai_lee
  • 开始时间 开始时间
D

duhai_lee

Unregistered / Unconfirmed
GUEST, unregistred user!
问题是这样的, 我有一个WORD文件,文件里有很多线段(这些线均是用WORD画的,有的是曲线,不过这个不重要,因为每条曲线都是有N个节点连接而成,而且可以取到每个节点NODES,但是倒霉的是,节点的POINTS是olevariant,我无法转换成可以show的string型,或者int型《很难过的。。。。。》),我想把这些线段(或者曲线节点)的坐标值取出来(即,每条线段的两个端点的坐标值)。最好附有源码, 我查了一天的资料也没有搞定。
提前也有分,给解决问题者200分,如果不够可以再加。

----------------------------------------------------------------------------------------------------------------------------------------------------------------
最新需求:
我现在需要一个关于直线的旋转函数(也就是直线两个端点旋转),是关于直线中心旋转的。
 
不会吧, 这可是传说中的大富翁啊。。。。。。。
 
由 Shape 对象组成的集合,该集合代表文档中或者文档页眉和页脚中的所有图形。每个 Shape 对象代表图形层中的一个对象,诸如自选图形、任意多边形、OLE 对象或图片等。

注意 如果需要处理文档图形的一个子集,例如只处理文档中的自选图形,或只处理选定的图形,就必须创建一个 ShapeRange 集合,以用该集合包含需要处理的图形。

使用 Shapes 集合

用 Shapes 属性可返回 Shapes 集合。下面的示例选定活动文档中的所有图形。

ActiveDocument.Shapes.SelectAll
注意 如果需要同时处理(例如删除或设置某个属性)文档中的所有图形,可用 Range 方法创建一个 ShapeRange 对象,该对象包含了 Shapes 集合中的所有图形,然后对 ShapeRange 对象应用相应的属性或方法。

用 Shapes 集合的下列方法之一可向文档中添加图形并返回一个 Shape 对象(该对象代表了新创建的图形):AddCallout、AddCurve、AddLabel、AddLine、AddOleControl、AddOleObject、AddPolyline、AddShape、AddTextbox、AddTextEffect 或 BuildFreeForm。下面的示例向活动文档添加一个矩形。

ActiveDocument.Shapes.AddShape msoShapeRectangle, 50, 50, 100, 200
用 Shapes(index) 可以返回单个的 Shape 对象,其中的 index 是该对象的名称或索引序号。下面的示例水平翻转活动文档中的第一个图形。

ActiveDocument.Shapes(1).Flip msoFlipHorizontal
下面的示例水平翻转活动文档中名为“ Rectangle 1 ”的图形。

ActiveDocument.Shapes("Rectangle 1").Flip msoFlipHorizontal
每个图形在创建时都得到一个默认的名称。例如,如果向文档中添加了三个不同的图形,它们将会得到诸如“矩形 2”、“文本框 3”和“椭圆 4”之类的名称。如果要给图形起一个更有意义的名称,请设置其 Name 属性。

说明

Shapes 集合不包含 InlineShape 对象。通常将 InlineShape 对象视为字符,并可将其象字符一样置于一行文本之中。尽管 Shape 对象的位置锁定于某一文本区域,但该对象可自由浮移,并可置于该页的任何位置。可用 ConvertToInlineShape 方法和 ConvertToShape 方法来转换图形的类型。但只能将图片、OLE 对象和 ActiveX 控件转换为嵌入式图形。

在文档中,集合的 Count 属性只返回主文字部分中的项数。要统计所有页眉和页脚中的图形的数量,可使用任何 HeaderFooter 对象的 Shapes 集合。
 
这个,基本上,很难
 
你可以通过OLE取得WORD的APPLICATION对象,然后对其操作。。
如还不明白, msn workjie@hotmail.com
Sub ss()
Set myLine = ActiveDocument.Shapes.AddLine(100, 100, 60, 20)
With myLine.Line
.BeginArrowheadStyle = msoArrowheadNone
.EndArrowheadStyle = msoArrowheadTriangle
.ForeColor.RGB = RGB(128, 0, 0)
End With
End Sub
 
To:workjie
感谢您的关注和指点。可惜这些理论对我用处不大啊。
appWord.ActiveDocument.Shapes.item(oleindex).Left 这是我获取一条线LEFT值的方法,返回SINGLE型,基本上没有问题,可是如果获取一条曲线的节点的坐标,没有办法,直线可以通过它的left,width,height,top,HorizontalFlip,VerticalFlip值确定其位置,但是对于曲线,只能知道它的笼括,虽然可以取到它的每个节点,但是返回的olevariant类型我不知道如何处理。
To : BrainYang
感谢您的关注。
 
不知道难度大不大,但是我想这些操作需要你对vba有一定的知识基础,我对word进行的操作都是先在word里面用宏录制,然后查看vba语法。
 
难道里面的图形不是利用WORD本身制作的吗?

如果是,那么VBA可以事项你的功能,如果不是,那么你有得做啦,据我所知,需要图形分析啦。
 
to:workjie
里面的内容完全是WORD本身所作,当然完全可以用VB作出来。但是我现在必须用delphi实现。
 
你可以参考ShapeNodes 集合对象
 
现在的问题是:
1, 某些时候,比如有文字,也有线,若将文字删除,则线的位置会变化,则获取的结果与实际WORD中的位置不符,若删除文字,线的位置无变化,则结果基本一样。
2, 无法获取线的NODES(节点)的坐标。
 
[red]Delphi中的快捷键一览表 [/red]
1.SHIFT+鼠标左键 先选中任一控件,按键后可选中窗体(选中控件后按Esc效果一样)
2.Shift+F8 调试时弹出CPU窗口。
3.Shift+F10 等于鼠标右键(Windows快捷键)。
4.****f+箭头 选择
5.shift +F12 快速查找窗体并打开
6.F7 (步进式调试同时追踪进入子过程)
7.F8 (步进式调试不进入子过程)
8.F9 运行
9.F12 切换EDITOR,FORM
10.Alt+F4 关闭所有编辑框中打开的源程序文件,但不关闭项目
11.ALT+鼠标左键 可以块选代码,用来删除对齐的重复代码非常有用
12.Ctrl+F9 编译
13.Ctrl+shift+N(n=1,2,3,4......) 定义书签
14.Ctrl+n(n=1,2,3,4......)跳到书签n
15.CTRL +SHIFT+N 在书签N处,再按一次 取消书签
16.Ctrl+PageUp 将光标移至本屏的第一行,屏幕不滚动
17.Ctrl+PageDown 将光标移至本屏的最后一行,屏幕不滚动
18.Ctrl+↓ 向下滚动屏幕,光标跟随滚动不出本屏
19.Ctrl+↑ 向上滚动屏幕,光标跟随滚动不出本屏
20.Ctrl+Home 将光标移至文件头
21.Ctrl+End 将光标移至文件尾
22.Ctrl+B Buffer List窗口
23.Ctrl+I 同Tab键
24.CTRL+J (弹出Delphi语句提示窗口,选择所需语句将自动完成一条语句)代码模板
25.Ctrl+M 同Enter键。
26.Ctrl+N 同Enter键,但光标位置保持不变
27.Ctrl+T 删除光标右边的一个单词
28.Ctrl+Y 删除光标所在行
29.CTRL+C 复制
30.CTRL+V 粘贴
31.CTRL+X 剪切
32.CTRL+Z 还原(Undo)
33.CTRL+S 保存
34.Ctrl+F 查找
35.Ctrl+L 继续查找
36.Ctrl+r 替换
37.CTRL+ENTER 定位到单元文件
38.Ctrl+F3 弹出Call Stack窗口
39.Ctrl+F4 等于File菜单中的Close项
40.Ctrl+Backspace 后退删除一个词,直到遇到一个分割符
41.Ctrl+鼠标转轮 加速滚屏
42.Ctrl+O+U 切换选择块的大小写(注意松开O后再按U,Ctrl保持按下)
43.Ctrl+K+O 切换选择块为小写(注意松开K后再按O,Ctrl保持按下)
44.Ctrl+K+N 切换选择块为大写(注意松开K后再按N,Ctrl保持按下)
45.Ctrl+Shift+G 插入GUID
46.Ctrl+Shift+T 在光标行加入To-Do注释
47.Ctrl+Shift+Y 删除光标之后至本行末尾之间的文本
48.CTRL+SHIFT+C 编写申明或者补上函数,绝好!!!
49.CTRL+SHIFT+E 显示EXPLORER
50.Ctrl+Tab 在Inspector中切换Properties页和Events页
51.CTRL+SHIFT+U 代码整块左移2个空格位置
52.CTRL+SHIFT+I 代码整块右移2个空格位置
53.CTRL+SHIFT+↑ 在过程、函数、事件内部, 可跳跃到相应的过程、函数、事
件的定义(在interface和implementation之间来回切换)
54.CTRL+SHIFT+↓ 在过程、函数、事件的定义处, 可跳跃到具体过程、函数、事件内部(同上)
55.Tab 在object inspector窗口按tab键将光标移动到属性名区,然后键入属性名的开头
字母可快速定位到该属性
56.Ctrl+Alt 按着Ctrl+Alt之后,可用鼠标选择一个矩形块中的代码,
并可比它进行复制,粘贴
57.Shift+↓、↑、→、← 以1像素单位更改所选控件大小
58.Ctrl+↓、↑、→、←以1像素单位更改所选控件位置
59.Ctrl+E 快速选择(呵呵,试试吧,很好玩的)
60.Ctrl+Alt+c 注释块
61.Ctrl+Alt+u 取消注释块
62.Ctrl+Alt+h 生成头(更详细的设置在GExperts配置的Editor Experts属性页)
63.Ctrl+Alt+o 选择对应分隔符之间的语句
64.Ctrl+Alt+v 在对应的分隔符之间来回跳转(与已有快捷键有冲突,请更改)
 
楼上这是?
呵呵:) 
 
大侠何在?
 
高手何在?
 
很着急的,怎么没有人来呢? 现在问题只有一个了,其他的都已经解决;
我获取的线段位置基本正确,但是有些文件读出之后,我重画效果不一样。
我认为原因是,图形(主要是线)和文字之间的环绕关系,导致读出的位置有影响。
 
我觉得这个问题利用VBA完全可以解决,你还是认真看那个吧。
现在不会有太多人有时间来帮你写程序的。
 
ok, 等我搞定了,帖答案出来。
 
ShapeNode Object
See Also Properties Methods Events Specifics
Shapes (Shape)
ShapeNodes (ShapeNode)

Represents the geometry and the geometry-editing properties of the nodes in a user-defined freeform. Nodes include the vertices between the segments of the freeform and the control points for curved segments. The ShapeNode object is a member of the ShapeNodes collection. The ShapeNodes collection contains all the nodes in a freeform.

Using the ShapeNode Object
Use Nodes(index), where index is the node index number, to return a single ShapeNode object. If node one in shape three on myDocument is a corner point, the following example makes it a smooth point. For this example to work, shape three must be a freeform.

Set myDocument = Worksheets(1)
With myDocument.Shapes(3)
If .Nodes(1).EditingType = msoEditingCorner Then
.Nodes.SetEditingType 1, msoEditingSmooth
End If
End With


Show All

Points Property
Points Property"/>
See Also Applies To Example Specifics
Returns the position of the specified node as a coordinate pair. Each coordinate is expressed in points. Read-only Variant.

Remarks
This property is read-only. Use the SetPosition method to set the value of this property.

Example
This example moves node two in shape three on myDocument to the right 200 points and down 300 points. Shape three must be a freeform drawing.

Set myDocument = Worksheets(1)
With myDocument.Shapes(3).Nodes
pointsArray = .Item(2).Points
currXvalue = pointsArray(1, 1)
currYvalue = pointsArray(1, 2)
.SetPosition 2, currXvalue + 200, currYvalue + 300
End With
 
后退
顶部