xod

Unfinished plugins

Recommended Posts

This is an experimental plugin.
You need the two OptionBasedLibrary v0.7.9 files.


You can place it where you want by editing the Align+.dlc file.
In order to do that you need to change the extension to .txt

Open it with Notepad and edit the line:
AlignEffectPlugin.SubmenuName=your choise
Save and change the extension to .dlc

 

3u8DCya.png

 

Download

Edited by xod
Replaced with new version.
  • Like 2
  • Upvote 1

Share this post


Link to post
Share on other sites

This is nice @xod, but it overwrites the one you wrote with @MJW, which I use all the time.

The coding needs to reflect that you are calling it 'Align+'.

Thanks!  :)

Share this post


Link to post
Share on other sites

That shouldn't happen.

For testing I placed it in the Object submenu.
In my case, the new plugin does not overwrite the existing one.
You probably have a different version of Align Object than the official one.

 

g7YU2lN.png

Share this post


Link to post
Share on other sites

And you are correct @xod.  I have an older version of the plugin because it loads it directly under Effects, which is where I want it because I use it often. :)

 

Share this post


Link to post
Share on other sites

<3 @xod!

 

I have Windows 7 and it doesn't work for me.
Because I have another "Aligin" plugin.
Is that why you think? :cake: :coffee:

Share this post


Link to post
Share on other sites

The original post was named Align.Zip which opened to reveal align.dll

 

On 12/8/2017 at 12:44 PM, xod said:

This is my finished Align plugin. I will not post it on the Plugins - Publishing ONLY! thread because there is already Kris Vandermotten's, which is extremely fast even on very large canvases.

Thank you very much to MJW who helped me a lot. I learned a lot from him.

 

The UI:
aO4vULI.png

 

And here is the dll file:

 

►  Align.zip   ◄

 

Your latest post may have the label Align# in the code, but the DLL file is still named align.zip which opens to Align.DLL and overwrites the old one when placed in the effects folder.

image.png.dfe46ac1eab0dd8279b26a26bb065059.png

 

Hope this clarifies for @Seerose

Share this post


Link to post
Share on other sites
10 hours ago, AndrewDavid said:

Your latest post may have the label Align# in the code, but the DLL file is still named align.zip which opens to Align.DLL and overwrites the old one when placed in the effects folder.

 

That's the problem. The dll file needs to be named 'Align+' so it doesn't overwrite the other one. :)

 

  • Like 1

Share this post


Link to post
Share on other sites

<3 @xod!

 

3 hours ago, lynxster4 said:

 

That's the problem. The dll file needs to be named 'Align+' so it doesn't overwrite the other one. :)

 

 

I think that's the problem. as @lynxster4 says!

 

13-September2019.png

Share this post


Link to post
Share on other sites

Okay, I understand that people don't really use the official version (Align Object) because it's in the Object submenu.
So, I changed the name of the .dll

  • Like 1

Share this post


Link to post
Share on other sites

1296931056_Align.zip is what your change created. Windows The Forum software may not like the "+" in file names. :)

 

Edited by AndrewDavid
Strikeout Windows
  • Like 1

Share this post


Link to post
Share on other sites

I updated the Align + plugin. See the first post.

 

The code below does not belong to me, I just adapted it for PDN.

Spoiler

// Name: ShapesPattern
// Submenu: Render
// Author: Rod Stephens
// Title: ShapesPattern
// Version: 1.0
// Desc:
// Keywords:
// URL:
// Help:

#region UICode
IntSliderControl Amount1 = 20; // [3,20] Shape sides
DoubleSliderControl Amount2 = 90; // [0,200] Offset
IntSliderControl Amount3 = 1; // [0,5] Repeat shape
DoubleSliderControl Amount4 = 1; // [0.05,10] Shape size
AngleControl Amount5 = 90; // [-180,180] Rotate
ColorWheelControl Amount6 = ColorBgra.FromBgra(0,0,255,64); // [Red?] Color
IntSliderControl Amount7 = 1; // [0,10] Outline thickness
CheckboxControl Amount8 = false; // [0,1] Clear background
CheckboxControl Amount9 = false; // [0,1] Fill polygons (Decrease Alpha slider)
#endregion

void Render(Surface dst, Surface src, Rectangle rect)
{
    Rectangle selection = EnvironmentParameters.GetSelection(src.Bounds).GetBoundsInt();
    dst.CopySurface(src,rect.Location,rect);
    int CenterX = ((selection.Right - selection.Left) / 2) + selection.Left;
    int CenterY = ((selection.Bottom - selection.Top) / 2) + selection.Top;

    using (Graphics g = new RenderArgs(dst).Graphics)
    using (Region gClipRegion = new Region(rect))
    using (SolidBrush brush = new SolidBrush(Amount6))
    using (Pen pen = new Pen(Amount6, (float)Amount7))
    {
        g.Clip = gClipRegion;
        g.SmoothingMode = SmoothingMode.AntiAlias;
        if(Amount8) g.Clear(Color.Transparent);

        PointF center = new PointF(CenterX, CenterY);
        float radius = Math.Min(CenterX, CenterY) * (float)Amount4;
        DrawShape(Amount3, g, brush, pen, center, radius);
        //g.DrawEllipse(Pens.Blue, CenterX - radius, CenterY - radius, 2 * radius, 2 * radius);
    }
}
// Draw the shape.
private void DrawShape(int Amount3, Graphics g, SolidBrush brush, Pen pen, PointF center, float radius)
{
    float scale = (float)(1.0 / (2.0 * (1 + Math.Cos(Math.PI/180 * Amount2))));
    // If we are done recursing, draw the shape.
    if (Amount3 <= 0)
    {
        // Find the shape's corners.
        PointF[] points = GetShapePoints(center, radius);
        if(Amount9){g.FillPolygon(brush, points);}
        if(Amount7 > 0) {g.DrawPolygon(pen, points);}
    }
    else
    {
        // Find the smaller shape's centers.
        float d = radius - radius * scale;
        PointF[] centers = GetShapePoints(center, d);

        // Recursively draw the smaller shapes.
        foreach (PointF point in centers)
        {
            DrawShape(Amount3 - 1, g, brush, pen, point, radius * scale);
        }
    }
}

// Find the shape's corners.
private PointF[] GetShapePoints(PointF center, float radius)
{
    PointF[] points = new PointF[Amount1];
    double theta = -Math.PI / 2 * Math.PI / 180 * Amount5 / Math.PI * 2;
    double dtheta = 2.0 * Math.PI / Amount1;
    for (int i = 0; i < Amount1; i++)
    {
        points[i] = new PointF( center.X + (float)(radius * Math.Cos(theta)), center.Y + (float)(radius * Math.Sin(theta)));
        theta += dtheta;
    }
    return points;
}

 

 

  • Like 3

Share this post


Link to post
Share on other sites

Thank you @xod for updating Align+!  <3

 

The code you posted brings very interesting results. Thank you for adapting it!  :)

 

shapespattern_01.png

 

shapespattern_02.png

 

A lot of things can be done with this.

 

  • Like 3

Share this post


Link to post
Share on other sites

The code below provides information about the object on the canvas.
It seems to work correctly in all situations where the object is on a transparent layer and even if the layer is full of color.
However, if I have an filled area of 10000x7500px and even for smaller values of the surface containing a transparent vertical strip as in the image below, the error 'A new guard page for the stack cannot be created' appears and Pdn crashes.
I can't figure out how to solve this.

Spoiler

// Name: MeasureTheObject
// Submenu:
// Author:
// Title: MeasureTheObject
// Version:
// Desc:
// Keywords:
// URL:
// Help:

#region UICode
ColorWheelControl Amount1 = ColorBgra.FromBgr(0,0,0); // [PrimaryColor!] Font color
DoubleSliderControl Amount2 = 0.75; // [0.1,5] Font scale
CheckboxControl Amount3 = false; // [0,1] Bounding box of object
#endregion

private PdnRegion _measureObject;
public int x, y, x1, xp1, xp2, yp1, yp2, y1, x2, y2, cx, cy, xPos, yPos, newx, newy, sTop, sBot, sLeft, sRite, width, height, _canvasWidth, _canvasHeight;

void Render(Surface dst, Surface src, Rectangle rect)
{
    Rectangle sel = EnvironmentParameters.GetSelection(src.Bounds).GetBoundsInt();
    Size selSize = EnvironmentParameters.GetSelection(src.Bounds).GetBoundsInt().Size;
    _canvasWidth = selSize.Width;
    _canvasHeight = selSize.Height;
    sTop = sel.Top;
    sBot = sel.Bottom;
    sLeft = sel.Left;
    sRite = sel.Right;

    int fontH = (int)(Amount2 * sel.Height/50);
    int fontHoffset = fontH + fontH/2;

    GetMeasureOfObject();
    Rectangle obj = _measureObject.GetBoundsInt();
    x1 = obj.Left;
    y1 = obj.Top;
    x2 = obj.Right - 1;
    y2 = obj.Bottom - 1;
    width = obj.Width;
    height = obj.Height;

    Point topLeftCorner = new Point (x1, y1);
    Point topRiteCorner = new Point (x2, y1);
    Point botLeftCorner = new Point (x1, y2);
    Point botRiteCorner = new Point (x2, y2);

    int cx = x1 + width/2;
    int cy = y1 + height/2;

    dst.CopySurface(src, rect.Location,rect);
    using (Font txtFont = new Font("Tahoma", fontH, FontStyle.Regular))
    using (SolidBrush txtBrush = new SolidBrush(Amount1))
    using (SolidBrush fillBrush = new SolidBrush(Color.FromArgb(64,255,0,0)))
    using (Pen pen = new Pen(Color.Red, 1))
    using (RenderArgs ra = new RenderArgs(dst))
    {
        Graphics g = ra.Graphics;
        g.Clip = new Region(rect);
        g.SmoothingMode = SmoothingMode.AntiAlias;
        g.TextRenderingHint = TextRenderingHint.AntiAlias;
        StringFormat format = new StringFormat();
        format.Alignment = StringAlignment.Near;
        format.LineAlignment = StringAlignment.Near;

        if(width == 0 || height == 0)
        {
            g.DrawString("Empty layer. There is no object.", txtFont, txtBrush, topLeftCorner, format);
        }
        else if(width == _canvasWidth && height == _canvasHeight)
        {
            g.DrawString("The object has the size of the layer.", txtFont, txtBrush, topLeftCorner, format);
        }
        else
        {
            //topleft corner
            format.Alignment = StringAlignment.Near;
            format.LineAlignment = StringAlignment.Near;
            g.DrawString("x:" + x1.ToString(), txtFont, txtBrush, topLeftCorner, format);
            g.DrawString("y:" + y1.ToString(), txtFont, txtBrush, x1, y1 + fontHoffset, format);

            //top right corner
            format.Alignment = StringAlignment.Far;
            format.LineAlignment = StringAlignment.Near;
            g.DrawString("x:" + x2.ToString(), txtFont, txtBrush, topRiteCorner, format);
            g.DrawString("y:" + y1.ToString(), txtFont, txtBrush, x2, y1 + fontHoffset, format);

            //bottom right corner
            format.Alignment = StringAlignment.Far;
            format.LineAlignment = StringAlignment.Far;
            g.DrawString("x:" + x2.ToString(), txtFont, txtBrush, x2, y2 - fontHoffset, format);
            g.DrawString("y:" + y2 .ToString(), txtFont, txtBrush, botRiteCorner, format);

            //bottom left corner
            format.Alignment = StringAlignment.Near;
            format.LineAlignment = StringAlignment.Far;
            g.DrawString("x:" + x1.ToString(), txtFont, txtBrush, x1, y2 - fontHoffset, format);
            g.DrawString("y:" + y2.ToString(), txtFont, txtBrush, botLeftCorner, format);

            //width and height
            format.Alignment = StringAlignment.Center;
            format.LineAlignment = StringAlignment.Center;
            g.DrawString("width:" + width.ToString() + "px", txtFont, txtBrush, cx, cy, format);
            g.DrawString("height:" + height.ToString() + "px", txtFont, txtBrush, cx, cy + fontHoffset, format);

            if(Amount3)
            {
                //g.DrawRectangle (pen, x1, y1, width, height);
                g.FillRectangle(fillBrush, x1, y1, width, height);
            }
        }
    }
}

private void  GetMeasureOfObject()
{
    if (_measureObject == null)
    {
        Surface src = EnvironmentParameters.SourceSurface;
        Rectangle sel = EnvironmentParameters.GetSelection(src.Bounds).GetBoundsInt();
        int left = sel.Left;
        int right = sel.Right;
        int top = sel.Top;
        int bottom = sel.Bottom;
        _measureObject = new PdnRegion(Rectangle.Empty);

        for (int y = top; y < bottom; y++)
        {
            for (int x = left; x < right; x++)
            {
                if (src[x, y].A > 0)
                {
                    int xinit = x;
                    do
                    {
                        x++;
                    }
                    while (x < right && src[x, y].A > 0);
                    _measureObject.Union(new Rectangle(xinit, y, x - xinit, 1));
                }
            }
        }
    }
}

 

 

exjdMMu.png

Share this post


Link to post
Share on other sites

This plugin allows you to write text along a curve.
There are only four control points.
The plugin is located in Effects -> Text Formations.

As usual, you need the two OptionBasedLibrary v0.7.9.dlc and OptionBasedLibrary v0.7.9.dll files.

 

h38sMuo.png

 

 

TextOnPath.zip

Edited by xod
Replaced with a new version. Added more options.
  • Like 3

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.