Welcome to the Onshape forum! Ask questions and join in the discussions about everything Onshape.
First time visiting? Here are some places to start:- Looking for a certain topic? Check out the categories filter or use Search (upper right).
- Need support? Ask a question to our Community Support category.
- Please submit support tickets for bugs but you can request improvements in the Product Feedback category.
- Be respectful, on topic and if you see a problem, Flag it.
If you would like to contact our Community Manager personally, feel free to send a private message or an email.
Placing a skRectangle centered on a queried vertex
Dylan_Stewart
Member, Developers Posts: 107 PRO
Hello all! I am trying to write a feature that will place a sketched rectangle the is centered on a queried vertex. I am looking at @NeilCooke 's "Mounting Boss" feature for guidance and basing my code on what he has. I'm pretty close but I am not getting the desired results.
FeatureScript 675;
import(path : "onshape/std/geometry.fs", version : "675.0");
export enum postSize
{
annotation { "Name" : "Small" }
SMALL,
annotation { "Name" : "Large" }
LARGE
}
export function postSizeID(value is postSize)
{
return{
"SMALL" : 4 * inch,
"LARGE" : 6 * inch
}[value as string];
}
annotation { "Feature Type Name" : "Adjustable Louvre" }
export const myFeature = defineFeature(function(context is Context, id is Id, definition is map)
precondition
{
annotation { "Name" : "My Query", "Filter" : EntityType.VERTEX, "MaxNumberOfPicks" : 4 }
definition.postLoc is Query;
annotation { "Name" : "Face Plane", "Filter" : EntityType.FACE, "MaxNumberOfPicks" : 1 }
definition.face is Query;
annotation { "Name" : "Post Size" }
definition.postSize is postSize;
annotation { "Name" : "Louvre Height" }
isLength(definition.louvreHeight, LENGTH_BOUNDS);
}
{
var postSize = postSizeID(definition.postSize);
var height = definition.louvreHeight;
const postLocation = evaluateQuery(context, definition.postLoc);
var sketchPlane is Plane = evOwnerSketchPlane(context, {
"entity" : postLocation[0]
});
var topPlane = evPlane(context, { "face" : definition.face});
definition.elemAdd = true;
definition.elemId = 1;
var nameId = 1;
var startPoint = vector(postLocation-postSize/2);
var endPoint = vector(postLocation+postSize/2);
definition.sketch = newSketchOnPlane(context, id + "sketch1", {
"sketchPlane" : topPlane
});
for (var location in postLocation)
{
var point is Vector = worldToPlane(topPlane, evVertexPoint(context, {
"vertex" : location
}));
// skRectangle(definition.sketch, "rectangle1" ~ nameId, {
// "center" : vector(point[0], point[1]),
// "firstCorner" : vector(point[0], point[1]),
// "secondCorner" : vector(postSize, postSize)
// });
skRectangle(definition.sketch, "rectangle2" ~ nameId, {
"center" : vector(point[0], point[1]),
"firstCorner" : startPoint,
"secondCorner" : endPoint
});
nameId += 1;
}
buildPost(context, id, definition);
});
function buildPost(context is Context, id is Id, definition is map)
{
skSolve(definition.sketch);
}
It seems like I am just missing something small.
Digital Engineering
0
Comments
Also, I realize now that my startPoint and endPoint variables are not separated by commas (fixed and still doesn't work).
Instead move defining startPoint, endPoint into the body of the loop.
const startPoint = vector(point[0] - postHalfSize, point[1] - postHalfSize);
with postHalfSize defined before of the loop.