OberonPlace.com Forums (http://forum.oberonplace.com/index.php)
-   CorelDRAW/Corel DESIGNER VBA (http://forum.oberonplace.com/forumdisplay.php?f=16)
-   -   Virtual shape and speed up (http://forum.oberonplace.com/showthread.php?t=24696)

 nic 22-09-2014 09:19

Virtual shape and speed up

Hi,
the code below takes the data from an array and draws a curved line through a set of x,y points. I would like to speed up that process and think doing it with a virtual layer would help but I can't get the syntax right. Where would i need to insert ActiveVirtualLayer and LogCreateShape?

Code:

Set crv = CreateCurve(ActiveDocument)

Set sp = crv.CreateSubPath(Data(1, 0), Data(1, 1))

For n =  2 To 2000
sp.AppendCurveSegment Data(n, 0), Data(n, 1)
Next n

sp.Closed = False

Set sShape = ActiveLayer.CreateCurve(crv)

and can the following be speeded up by smoothing all the nodes in one go rather than running through a loop?

Code:

'smooth nodes
Set nr = sShape.Curve.Nodes.All
For Each nd In nr
nd.Type = cdrSmoothNode
Next nd

Thanks
nic

 shelbym 28-09-2014 23:29

Virtual Curves and Shapes

This should get you started:
Code:

Sub CreateMyVirtualCurve()
Dim s As Shape, crv As Curve
Dim x As Double, y As Double
Dim arrPoints(9, 1) As Double

arrPoints(0, 0) = 162.4175222: arrPoints(0, 1) = 0.750376435
arrPoints(1, 0) = 162.1904178: arrPoints(1, 1) = 1.42190801
arrPoints(2, 0) = 161.8497645: arrPoints(2, 1) = 1.948110991
arrPoints(3, 0) = 161.4460634: arrPoints(3, 1) = 2.285272734
arrPoints(4, 0) = 161.0384773: arrPoints(4, 1) = 2.41926736
arrPoints(5, 0) = 160.6855104: arrPoints(5, 1) = 2.367701481
arrPoints(6, 0) = 160.4357975: arrPoints(6, 1) = 2.177051589
arrPoints(7, 0) = 160.3204565: arrPoints(7, 1) = 1.915245416
arrPoints(8, 0) = 160.3482122: arrPoints(8, 1) = 1.66085887
arrPoints(9, 0) = 160.5040603: arrPoints(9, 1) = 1.490634456

x = arrPoints(0, 0)
y = arrPoints(0, 1)

Set crv = New Curve 'Create our curve in Memory
Set sp = crv.CreateSubPath(x, y)

For i = 1 To 9
x = arrPoints(i, 0)
y = arrPoints(i, 1)
sp.AppendCurveSegment x, y
Next i

sp.Closed = False

'Take our curve in memory and create a virtual shape
Set s = ActiveVirtualLayer.CreateCurve(crv)

'Smooth all the nodes
s.Curve.Nodes.All.SetType cdrSmoothNode

'Log the newly created virual shape
ActiveDocument.LogCreateShape s
End Sub

Also, just for fun. In X7 there is a much easier way to do this:
Code:

Sub CreateMyVirtualCurveX7()
Dim s As Shape, crv As Curve
Dim pr As New PointRange
Dim arrPoints(9, 1) As Double

arrPoints(0, 0) = 162.4175222: arrPoints(0, 1) = 0.750376435
arrPoints(1, 0) = 162.1904178: arrPoints(1, 1) = 1.42190801
arrPoints(2, 0) = 161.8497645: arrPoints(2, 1) = 1.948110991
arrPoints(3, 0) = 161.4460634: arrPoints(3, 1) = 2.285272734
arrPoints(4, 0) = 161.0384773: arrPoints(4, 1) = 2.41926736
arrPoints(5, 0) = 160.6855104: arrPoints(5, 1) = 2.367701481
arrPoints(6, 0) = 160.4357975: arrPoints(6, 1) = 2.177051589
arrPoints(7, 0) = 160.3204565: arrPoints(7, 1) = 1.915245416
arrPoints(8, 0) = 160.3482122: arrPoints(8, 1) = 1.66085887
arrPoints(9, 0) = 160.5040603: arrPoints(9, 1) = 1.490634456

For i = 0 To 9
Next i

Set crv = ActiveDocument.CreateCurveFitToPoints(pr)
'Or you can set a tolerance
'Set crv = ActiveDocument.CreateCurveFitToPoints(pr, False, .01)

Set s = ActiveVirtualLayer.CreateCurve(crv)

ActiveDocument.LogCreateShape s
End Sub

Hope that helps,

-Shelby

 nic 29-09-2014 12:29

Thanks

Hi Shelby
tried out both methods and found they both worked - went with the first as it kept the number of nodes constant and the number of nodes is significant in this case: The second method draws the line but decides itself how many nodes it needs

Im not sure if working with virtual layers saved much time here but Im glad to have learned a little about them and have projects that would benefit but there was a little gem in your code that did knock off a huge bunch of time -

s.Curve.Nodes.All.SetType cdrSmoothNode

as opposed to my code

For Each nd In sShape.Curve.Nodes
nd.Type = cdrSmoothNode
Next nd