OberonPlace.com Forums

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))
   
    'add curves to shape
    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
        pr.AddPointXY arrPoints(i, 0), arrPoints(i, 1)
    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

Thanks again for your help.


All times are GMT -5. The time now is 04:50.

Powered by vBulletin® Version 3.8.1
Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
Copyright © 2011, Oberonplace.com