Как получить 4 угла X, Y координаты значения прямоугольника FabricJS

Некоторые хорошие ответы здесь, но я хотел указать еще пару вещей. Функциональные параметры на самом деле являются местом, где сияет PowerShell. Например, вы можете иметь либо именованные, либо позиционные параметры в таких расширенных функциях:

function Get-Something
{
    Param
    (
         [Parameter(Mandatory=$true, Position=0)]
         [string] $Name,
         [Parameter(Mandatory=$true, Position=1)]
         [int] $Id
    )
}

Тогда вы можете либо вызвать его, указав имя параметра, либо просто использовать позиционные параметры, так как вы явно определили их. Таким образом, любой из них будет работать:

Get-Something -Id 34 -Name "Blah" 
Get-Something "Blah" 34

Первый пример работает, хотя имя предоставляется вторым, потому что мы явно использовали имя параметра. Второй пример работает на основе позиции, поэтому Name должно быть первым. Когда это возможно, я всегда пытаюсь определить позиции, так что доступны обе опции.

PowerShell также имеет возможность определять наборы параметров. Он использует это вместо перегрузки метода и снова весьма полезен:

function Get-Something
{
    [CmdletBinding(DefaultParameterSetName='Name')]
    Param
    (
         [Parameter(Mandatory=$true, Position=0, ParameterSetName='Name')]
         [string] $Name,
         [Parameter(Mandatory=$true, Position=0, ParameterSetName='Id')]
         [int] $Id
    )
}

Теперь функция либо примет имя, либо идентификатор, но не то, и другое. Вы можете использовать их позиционно или по имени. Поскольку они представляют собой другой тип, PowerShell выяснит это. Таким образом, все это будет работать

Get-Something "some name"
Get-Something 23
Get-Something -Name "some name"
Get-Something -Id 23

. Вы также можете назначить дополнительные параметры для различных наборов параметров. (Очевидно, это был довольно простой пример). Внутри функции вы можете определить, какой набор параметров использовался с свойством $ PsCmdlet.ParameterSetName. Например:

if($PsCmdlet.ParameterSetName -eq "Name")
{
    Write-Host "Doing something with name here"
}

Затем в соответствующей заметке есть также проверка параметров в PowerShell. Это одна из моих любимых функций PowerShell, и она делает код внутри ваших функций очень чистым. Существуют многочисленные проверки, которые вы можете использовать. Пара примеров -

function Get-Something
{
    Param
    (
         [Parameter(Mandatory=$true, Position=0)]
         [ValidatePattern('^Some.*')]
         [string] $Name,
         [Parameter(Mandatory=$true, Position=1)]
         [ValidateRange(10,100)]
         [int] $Id
    )
}

. В первом примере ValidatePattern принимает регулярное выражение, которое гарантирует, что предоставленный параметр соответствует ожидаемому. Если это не так, возникает интуитивное исключение, в котором вы точно указываете, что не так. Таким образом, в этом примере «что-то» будет работать нормально, но «лето» не пройдет проверку.

ValidateRange гарантирует, что значение параметра находится между диапазоном, который вы ожидаете от целого. Таким образом, 10 или 99 будут работать, но 101 сделает исключение.

Еще один полезный вариант - ValidateSet, который позволяет явно определить массив допустимых значений. Если что-то еще введено, будет выбрано исключение. Есть и другие, но, вероятно, наиболее полезным является ValidateScript. Для этого требуется блок сценария, который должен оцениваться до $ true, поэтому небо - это предел. Например:

function Get-Something
{
    Param
    (
         [Parameter(Mandatory=$true, Position=0)]
         [ValidateScript({ Test-Path $_ -PathType 'Leaf' })]
         [ValidateScript({ (Get-Item $_ | select -Expand Extension) -eq ".csv" })]
         [string] $Path
    )
}

В этом примере мы уверены не только в том, что $ Path существует, но и в том, что это файл (в отличие от каталога) и имеет расширение .csv. ($ _ относится к параметру, когда внутри вашего скриптового блока.) Вы также можете передавать гораздо большие многострочные блоки сценариев, если требуется этот уровень, или использовать несколько сценариев, подобных мне. Это чрезвычайно полезно и обеспечивает отличные чистые функции и интуитивные исключения.

-2
задан Rory McCrossan 16 January 2019 в 16:26
поделиться

1 ответ

Вы пробовали oCoords / aCoords?

Это свойство должно возвращать все углы с применением поворота

http://fabricjs.com/docs/fabric .Rect.html # oCoords

http://fabricjs.com/docs/fabric.Rect.html#aCoords

Обновить [1115 ]

Поскольку вы хотите сохранить координаты для извлечения и отрисовки прямоугольника обратно из данных БД, я думаю, что лучше хранить не 4 угловые координаты, а слева, сверху, ширину, высоту, угол, масштаб. Так что вы можете создать прямоугольник в зависимости от этих свойств. Если вам это не нужно для использования в Fabricjs, вы можете использовать oCoords, о котором я упоминал ранее.

Метод

getCoords также позволяет использовать

http://fabricjs.com/docs/fabric.Rect.html#getCoords

0
ответ дан Danil Gudz 16 January 2019 в 16:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: