From dea573e15695fbd610fe059de199d4f7512d3610 Mon Sep 17 00:00:00 2001 From: whitequark Date: Fri, 17 Feb 2017 03:18:34 +0000 Subject: [PATCH] Highlight normals and circle radii that have a degree of freedom. --- .gitignore | 2 +- src/drawentity.cpp | 28 +++ src/graphicswin.cpp | 1 + src/style.cpp | 2 +- test/request/circle/free_in_3d.png | Bin 0 -> 4806 bytes test/request/circle/free_in_3d.slvs | 294 ++++++++++++++++++++++++ test/request/circle/free_in_3d_dof.png | Bin 0 -> 7197 bytes test/request/circle/free_in_3d_v20.slvs | 292 +++++++++++++++++++++++ test/request/circle/free_in_3d_v22.slvs | 294 ++++++++++++++++++++++++ test/request/circle/normal_dof.png | Bin 0 -> 4820 bytes test/request/circle/test.cpp | 28 +++ 11 files changed, 939 insertions(+), 2 deletions(-) create mode 100644 test/request/circle/free_in_3d.png create mode 100644 test/request/circle/free_in_3d.slvs create mode 100644 test/request/circle/free_in_3d_dof.png create mode 100644 test/request/circle/free_in_3d_v20.slvs create mode 100644 test/request/circle/free_in_3d_v22.slvs create mode 100644 test/request/circle/normal_dof.png diff --git a/.gitignore b/.gitignore index a85e90e6..5301e142 100644 --- a/.gitignore +++ b/.gitignore @@ -12,4 +12,4 @@ /debian/libslvs1/ /debian/libslvs1-dev/ /obj-*/ -*.slvs +/*.slvs diff --git a/src/drawentity.cpp b/src/drawentity.cpp index 7f534ef6..1e5a31ec 100644 --- a/src/drawentity.cpp +++ b/src/drawentity.cpp @@ -601,6 +601,20 @@ void Entity::Draw(DrawAs how, Canvas *canvas) { Vector axis = q.RotationV(); canvas->DrawLine(tip, tip.Minus(v.RotatedAbout(axis, 0.6)), hcs); canvas->DrawLine(tip, tip.Minus(v.RotatedAbout(axis, -0.6)), hcs); + + if(type == Type::NORMAL_IN_3D) { + Param *nw = SK.GetParam(param[0]), + *nx = SK.GetParam(param[1]), + *ny = SK.GetParam(param[2]), + *nz = SK.GetParam(param[3]); + + if(nw->free || nx->free || ny->free || nz->free) { + Canvas::Stroke analyzeStroke = Style::Stroke(Style::ANALYZE); + analyzeStroke.layer = Canvas::Layer::FRONT; + Canvas::hStroke hcsAnalyze = canvas->GetStroke(analyzeStroke); + canvas->DrawLine(tail, tip, hcsAnalyze); + } + } } return; } @@ -665,6 +679,20 @@ void Entity::Draw(DrawAs how, Canvas *canvas) { if(!canvas->DrawBeziers(*GetOrGenerateBezierCurves(), hcs)) { canvas->DrawEdges(*GetOrGenerateEdges(), hcs); } + if(type == Type::CIRCLE) { + Entity *dist = SK.GetEntity(distance); + if(dist->type == Type::DISTANCE) { + Param *p = SK.GetParam(dist->param[0]); + if(p->free) { + Canvas::Stroke analyzeStroke = Style::Stroke(Style::ANALYZE); + analyzeStroke.layer = Canvas::Layer::FRONT; + Canvas::hStroke hcsAnalyze = canvas->GetStroke(analyzeStroke); + if(!canvas->DrawBeziers(*GetOrGenerateBezierCurves(), hcsAnalyze)) { + canvas->DrawEdges(*GetOrGenerateEdges(), hcsAnalyze); + } + } + } + } return; } diff --git a/src/graphicswin.cpp b/src/graphicswin.cpp index 076c5d39..4413bb64 100644 --- a/src/graphicswin.cpp +++ b/src/graphicswin.cpp @@ -789,6 +789,7 @@ void GraphicsWindow::MenuEdit(Command id) { SS.exportMode = false; SS.GenerateAll(SolveSpaceUI::Generate::ALL); } + SS.GW.persistentDirty = true; break; case Command::SELECT_ALL: { diff --git a/src/style.cpp b/src/style.cpp index 06534729..4af11c87 100644 --- a/src/style.cpp +++ b/src/style.cpp @@ -18,7 +18,7 @@ const Style::Default Style::Defaults[] = { { { HOVERED }, "Hovered", RGBf(1.0, 1.0, 0.0), 1.5, 0 }, { { CONTOUR_FILL }, "ContourFill", RGBf(0.0, 0.1, 0.1), 1.0, 0 }, { { NORMALS }, "Normals", RGBf(0.0, 0.4, 0.4), 1.0, 0 }, - { { ANALYZE }, "Analyze", RGBf(0.0, 1.0, 1.0), 1.0, 0 }, + { { ANALYZE }, "Analyze", RGBf(0.0, 1.0, 1.0), 3.0, 0 }, { { DRAW_ERROR }, "DrawError", RGBf(1.0, 0.0, 0.0), 8.0, 0 }, { { DIM_SOLID }, "DimSolid", RGBf(0.1, 0.1, 0.1), 1.0, 0 }, { { HIDDEN_EDGE }, "HiddenEdge", RGBf(0.8, 0.8, 0.8), 1.0, 1 }, diff --git a/test/request/circle/free_in_3d.png b/test/request/circle/free_in_3d.png new file mode 100644 index 0000000000000000000000000000000000000000..c735d860f5b99e73b06ee72763c0cf927cb7eaf2 GIT binary patch literal 4806 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 Y;0?!2ukJTS=2KvkgX_i;dveOZ0F?gcXaE2J literal 0 HcmV?d00001 diff --git a/test/request/circle/free_in_3d.slvs b/test/request/circle/free_in_3d.slvs new file mode 100644 index 00000000..41287aa1 --- /dev/null +++ b/test/request/circle/free_in_3d.slvs @@ -0,0 +1,294 @@ +±²³SolveSpaceREVa + + +Group.h.v=00000001 +Group.type=5000 +Group.name=#references +Group.color=ff000000 +Group.skipFirst=0 +Group.predef.swapUV=0 +Group.predef.negateU=0 +Group.predef.negateV=0 +Group.visible=1 +Group.suppress=0 +Group.relaxConstraints=0 +Group.allowRedundant=0 +Group.allDimsReference=0 +Group.scale=1.00000000000000000000 +Group.remap={ +} +AddGroup + +Group.h.v=00000002 +Group.type=5001 +Group.order=1 +Group.name=sketch-in-plane +Group.activeWorkplane.v=80020000 +Group.color=ff000000 +Group.subtype=6000 +Group.skipFirst=0 +Group.predef.q.w=1.00000000000000000000 +Group.predef.origin.v=00010001 +Group.predef.swapUV=0 +Group.predef.negateU=0 +Group.predef.negateV=0 +Group.visible=1 +Group.suppress=0 +Group.relaxConstraints=0 +Group.allowRedundant=0 +Group.allDimsReference=0 +Group.scale=1.00000000000000000000 +Group.remap={ +} +AddGroup + +Param.h.v.=00010010 +AddParam + +Param.h.v.=00010011 +AddParam + +Param.h.v.=00010012 +AddParam + +Param.h.v.=00010020 +Param.val=1.00000000000000000000 +AddParam + +Param.h.v.=00010021 +AddParam + +Param.h.v.=00010022 +AddParam + +Param.h.v.=00010023 +AddParam + +Param.h.v.=00020010 +AddParam + +Param.h.v.=00020011 +AddParam + +Param.h.v.=00020012 +AddParam + +Param.h.v.=00020020 +Param.val=0.50000000000000000000 +AddParam + +Param.h.v.=00020021 +Param.val=0.50000000000000000000 +AddParam + +Param.h.v.=00020022 +Param.val=0.50000000000000000000 +AddParam + +Param.h.v.=00020023 +Param.val=0.50000000000000000000 +AddParam + +Param.h.v.=00030010 +AddParam + +Param.h.v.=00030011 +AddParam + +Param.h.v.=00030012 +AddParam + +Param.h.v.=00030020 +Param.val=0.50000000000000000000 +AddParam + +Param.h.v.=00030021 +Param.val=-0.50000000000000000000 +AddParam + +Param.h.v.=00030022 +Param.val=-0.50000000000000000000 +AddParam + +Param.h.v.=00030023 +Param.val=-0.50000000000000000000 +AddParam + +Param.h.v.=00040010 +Param.val=-5.00000000000000000000 +AddParam + +Param.h.v.=00040011 +Param.val=5.00000000000000000000 +AddParam + +Param.h.v.=00040012 +AddParam + +Param.h.v.=00040020 +Param.val=1.00000000000000000000 +AddParam + +Param.h.v.=00040021 +AddParam + +Param.h.v.=00040022 +AddParam + +Param.h.v.=00040023 +AddParam + +Param.h.v.=00040040 +Param.val=5.00000000000000000000 +AddParam + +Request.h.v=00000001 +Request.type=100 +Request.group.v=00000001 +Request.construction=0 +AddRequest + +Request.h.v=00000002 +Request.type=100 +Request.group.v=00000001 +Request.construction=0 +AddRequest + +Request.h.v=00000003 +Request.type=100 +Request.group.v=00000001 +Request.construction=0 +AddRequest + +Request.h.v=00000004 +Request.type=400 +Request.group.v=00000002 +Request.construction=0 +AddRequest + +Entity.h.v=00010000 +Entity.type=10000 +Entity.construction=0 +Entity.point[0].v=00010001 +Entity.normal.v=00010020 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00010001 +Entity.type=2000 +Entity.construction=1 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00010020 +Entity.type=3000 +Entity.construction=0 +Entity.point[0].v=00010001 +Entity.actNormal.w=1.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00020000 +Entity.type=10000 +Entity.construction=0 +Entity.point[0].v=00020001 +Entity.normal.v=00020020 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00020001 +Entity.type=2000 +Entity.construction=1 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00020020 +Entity.type=3000 +Entity.construction=0 +Entity.point[0].v=00020001 +Entity.actNormal.w=0.50000000000000000000 +Entity.actNormal.vx=0.50000000000000000000 +Entity.actNormal.vy=0.50000000000000000000 +Entity.actNormal.vz=0.50000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00030000 +Entity.type=10000 +Entity.construction=0 +Entity.point[0].v=00030001 +Entity.normal.v=00030020 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00030001 +Entity.type=2000 +Entity.construction=1 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00030020 +Entity.type=3000 +Entity.construction=0 +Entity.point[0].v=00030001 +Entity.actNormal.w=0.50000000000000000000 +Entity.actNormal.vx=-0.50000000000000000000 +Entity.actNormal.vy=-0.50000000000000000000 +Entity.actNormal.vz=-0.50000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00040000 +Entity.type=13000 +Entity.construction=0 +Entity.point[0].v=00040001 +Entity.normal.v=00040020 +Entity.distance.v=00040040 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00040001 +Entity.type=2000 +Entity.construction=0 +Entity.actPoint.x=-5.00000000000000000000 +Entity.actPoint.y=5.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00040020 +Entity.type=3000 +Entity.construction=0 +Entity.point[0].v=00040001 +Entity.actNormal.w=1.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00040040 +Entity.type=4000 +Entity.construction=0 +Entity.actDistance=5.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80020000 +Entity.type=10000 +Entity.construction=0 +Entity.point[0].v=80020002 +Entity.normal.v=80020001 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80020001 +Entity.type=3010 +Entity.construction=0 +Entity.point[0].v=80020002 +Entity.actNormal.w=1.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80020002 +Entity.type=2012 +Entity.construction=1 +Entity.actVisible=1 +AddEntity + diff --git a/test/request/circle/free_in_3d_dof.png b/test/request/circle/free_in_3d_dof.png new file mode 100644 index 0000000000000000000000000000000000000000..010296d21b404a589db045806d1f754a4182e85b GIT binary patch literal 7197 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 literal 0 HcmV?d00001 diff --git a/test/request/circle/test.cpp b/test/request/circle/test.cpp index 5e9db1b1..82cd8781 100644 --- a/test/request/circle/test.cpp +++ b/test/request/circle/test.cpp @@ -15,3 +15,31 @@ TEST_CASE(normal_migrate_from_v22) { CHECK_LOAD("normal_v22.slvs"); CHECK_SAVE("normal.slvs"); } + +TEST_CASE(free_in_3d_roundtrip) { + CHECK_LOAD("free_in_3d.slvs"); + CHECK_RENDER("free_in_3d.png"); + CHECK_SAVE("free_in_3d.slvs"); +} + +TEST_CASE(free_in_3d_migrate_from_v20) { + CHECK_LOAD("free_in_3d_v20.slvs"); + CHECK_SAVE("free_in_3d.slvs"); +} + +TEST_CASE(free_in_3d_migrate_from_v22) { + CHECK_LOAD("free_in_3d_v22.slvs"); + CHECK_SAVE("free_in_3d.slvs"); +} + +TEST_CASE(normal_dof) { + CHECK_LOAD("normal.slvs"); + SS.GenerateAll(SolveSpaceUI::Generate::ALL, /*andFindFree=*/true); + CHECK_RENDER("normal_dof.png"); +} + +TEST_CASE(free_in_3d_dof) { + CHECK_LOAD("free_in_3d.slvs"); + SS.GenerateAll(SolveSpaceUI::Generate::ALL, /*andFindFree=*/true); + CHECK_RENDER_ISO("free_in_3d_dof.png"); +}