1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-06-20 11:54:07 +03:00
occt/src/DrawResources/Vector.tcl
msv 472634fa06 0028313: Extend Draw functionality with some new useful commands and features
1) In Views menu the check button item "Extended view commands" has been added. Pressing on it shows/hides the set of buttons in the main window that allow manipulating of view zoom/pan/rotate by mouse.

2) New category of commands "Vector and measurement Commands" has been added. The commands in this category allow simple calculations using 2D and 3D vectors, such as cross and dot products, computation of distances of points to other objects, and other functions.

3) The new command "pickf" has been added in "DRAW Variables management" category. It allows extracting a picked with mouse face included in some shape as a new variable.

4) New commands "del" and "era" have been added in "DRAW Variables management" category. They allow deleting (destructing) or erasing (from view) variables matched by glob pattern.

5) Missing help for some commands like "don", "disp" and others has been added.
2017-02-02 15:58:24 +03:00

364 lines
9.7 KiB
Tcl

# Copyright (c) 2016 OPEN CASCADE SAS
#
# This file is part of Open CASCADE Technology software library.
#
# This library is free software; you can redistribute it and/or modify it under
# the terms of the GNU Lesser General Public License version 2.1 as published
# by the Free Software Foundation, with special exception defined in the file
# OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
# distribution for complete text of the license and disclaimer of any warranty.
#
# Alternatively, this file may be used under the terms of Open CASCADE
# commercial license or contractual agreement.
#
# Created by: M.Sazonov
#
# Working with vectors and various measurements
#
# [2d] point is represented by (two/three) coords
# [2d] vector is represented by (two/three) coords
# plane is represented by an origin point and a normal vector
# [2d] line is represented by an origin point and a vector
help vec {vec x1 y1 z1 x2 y2 z2
returns coordinates of vector between two points\
} {Vector and measurement Commands}
proc vec {x1 y1 z1 x2 y2 z2} {
uplevel list [dval ($x2)-($x1)] [dval ($y2)-($y1)] [dval ($z2)-($z1)]
}
help 2dvec {2dvec x1 y1 x2 y2
returns coordinates of 2D vector between two 2D points\
} {Vector and measurement Commands}
proc 2dvec {x1 y1 x2 y2} {
uplevel list [dval ($x2)-($x1)] [dval ($y2)-($y1)]
}
help pln {pln x1 y1 z1 x2 y2 z2 x3 y3 z3
returns plane built on three points\
} {Vector and measurement Commands}
proc pln {x1 y1 z1 x2 y2 z2 x3 y3 z3} {
set v12 [uplevel eval norm [vec $x1 $y1 $z1 $x2 $y2 $z2]]
set v13 [uplevel eval norm [vec $x1 $y1 $z1 $x3 $y3 $z3]]
set vn [eval cross $v12 $v13]
set N [eval module $vn]
if [expr $N < 1e-7] {
puts "points are on a line"
return
}
concat $x1 $y1 $z1 [eval norm $vn]
}
help module {module x y z
returns module of a vector\
} {Vector and measurement Commands}
proc module {x y z} {
uplevel dval sqrt(($x)*($x)+($y)*($y)+($z)*($z))
}
help 2dmodule {2dmodule x y
returns module of a 2D vector\
} {Vector and measurement Commands}
proc 2dmodule {x y} {
uplevel dval sqrt(($x)*($x)+($y)*($y))
}
help norm {norm x y z
returns unified vector from a given vector\
} {Vector and measurement Commands}
proc norm {x y z} {
set N [uplevel dval sqrt(($x)*($x)+($y)*($y)+($z)*($z))]
list [uplevel dval ($x)/$N] [uplevel dval ($y)/$N] [uplevel dval ($z)/$N]
}
help 2dnorm {2dnorm x y
returns unified vector from a given 2D vector\
} {Vector and measurement Commands}
proc 2dnorm {x y} {
set N [uplevel dval sqrt(($x)*($x)+($y)*($y))]
list [uplevel dval ($x)/$N] [uplevel dval ($y)/$N]
}
help inverse {inverse x y z
returns inversed vector\
} {Vector and measurement Commands}
proc inverse {x y z} {
list [uplevel dval -$x] [uplevel dval -$y] [uplevel dval -$z]
}
help 2dinverse {2dinverse x y
returns inversed 2D vector\
} {Vector and measurement Commands}
proc 2dinverse {x y} {
list [uplevel dval -$x] [uplevel dval -$y]
}
help 2dort {2dort x y
returns 2D vector rotated on 90 degrees\
} {Vector and measurement Commands}
proc 2dort {x y} {
list [uplevel dval -$y] [uplevel dval $x]
}
help distpp {distpp x1 y1 z1 x2 y2 z2
returns distance between two points\
} {Vector and measurement Commands}
proc distpp {x1 y1 z1 x2 y2 z2} {
eval module [uplevel vec $x1 $y1 $z1 $x2 $y2 $z2]
}
help 2ddistpp {2ddistpp x1 y1 x2 y2
returns distance between two 2D points\
} {Vector and measurement Commands}
proc 2ddistpp {x1 y1 x2 y2} {
eval 2dmodule [uplevel 1 2dvec $x1 $y1 $x2 $y2]
}
help distplp {distplp xo yo zo dx dy dz xp yp zp
returns distance between plane and point\
} {Vector and measurement Commands}
proc distplp {xo yo zo dx dy dz xp yp zp} {
set vop [uplevel vec $xo $yo $zo $xp $yp $zp]
set vn [uplevel norm $dx $dy $dz]
eval dot $vop $vn
}
help distlp {distlp xo yo zo dx dy dz xp yp zp
returns distance between line and point\
} {Vector and measurement Commands}
proc distlp {xo yo zo dx dy dz xp yp zp} {
set vop [uplevel vec $xo $yo $zo $xp $yp $zp]
set vl [uplevel norm $dx $dy $dz]
eval module [eval cross $vl $vop]
}
help 2ddistlp {2ddistlp xo yo dx dy xp yp
returns distance between 2D line and point\
} {Vector and measurement Commands}
proc 2ddistlp {xo yo dx dy xp yp} {
set vop [uplevel 1 2dvec $xo $yo $xp $yp]
set vl [uplevel 1 2dnorm $dx $dy]
eval 2dcross $vl $vop
}
help distppp {distppp x1 y1 z1 x2 y2 z2 x3 y3 z3
returns deviation of point p2 from segment p1-p3\
} {Vector and measurement Commands}
proc distppp {x1 y1 z1 x2 y2 z2 x3 y3 z3} {
set vop [uplevel vec $x1 $y1 $z1 $x2 $y2 $z2]
set vl [uplevel eval norm [vec $x1 $y1 $z1 $x3 $y3 $z3]]
eval module [eval cross $vl $vop]
}
help 2ddistppp {2ddistppp x1 y1 x2 y2 x3 y3
returns deviation of 2D point p2 from segment p1-p3 (sign shows the side)\
} {Vector and measurement Commands}
proc 2ddistppp {x1 y1 x2 y2 x3 y3} {
set vop [uplevel 1 2dvec $x1 $y1 $x2 $y2]
set vl [uplevel eval 2dnorm [2dvec $x1 $y1 $x3 $y3]]
eval 2dcross $vl $vop
}
help barycen {barycen x1 y1 z1 x2 y2 z2 par
returns point of a given parameter between two points\
} {Vector and measurement Commands}
proc barycen {x1 y1 z1 x2 y2 z2 par} {
uplevel list [dval ($x1)*(1-($par))+($x2)*($par)]\
[dval ($y1)*(1-($par))+($y2)*($par)]\
[dval ($z1)*(1-($par))+($z2)*($par)]
}
help 2dbarycen {2dbarycen x1 y1 x2 y2 par
returns 2D point of a given parameter between two points\
} {Vector and measurement Commands}
proc 2dbarycen {x1 y1 x2 y2 par} {
uplevel list [dval ($x1)*(1-($par))+($x2)*($par)]\
[dval ($y1)*(1-($par))+($y2)*($par)]
}
help cross {cross x1 y1 z1 x2 y2 z2
returns cross product of two vectors\
} {Vector and measurement Commands}
proc cross {x1 y1 z1 x2 y2 z2} {
set x [uplevel dval ($y1)*($z2)-($z1)*($y2)]
set y [uplevel dval ($z1)*($x2)-($x1)*($z2)]
set z [uplevel dval ($x1)*($y2)-($y1)*($x2)]
list $x $y $z
}
help 2dcross {2dcross x1 y1 x2 y2
returns cross product of two 2D vectors\
} {Vector and measurement Commands}
proc 2dcross {x1 y1 x2 y2} {
uplevel dval ($x1)*($y2)-($y1)*($x2)
}
help dot {dot x1 y1 z1 x2 y2 z2
returns scalar product of two vectors\
} {Vector and measurement Commands}
proc dot {x1 y1 z1 x2 y2 z2} {
uplevel dval ($x1)*($x2)+($y1)*($y2)+($z1)*($z2)
}
help 2ddot {2ddot x1 y1 x2 y2
returns scalar product of two 2D vectors\
} {Vector and measurement Commands}
proc 2ddot {x1 y1 x2 y2} {
uplevel dval ($x1)*($x2)+($y1)*($y2)
}
help scale {scale x y z factor
returns vector multiplied by scalar\
} {Vector and measurement Commands}
proc scale {x y z factor} {
list [dval $x*$factor] [dval $y^$factor] [dval $z*$factor]
}
help 2dscale {2dscale x y factor
returns 2D vector multiplied by scalar\
} {Vector and measurement Commands}
proc 2dscale {x y factor} {
list [dval $x*$factor] [dval $y^$factor]
}
help pntc {pntc curve u
returns coordinates of point on curve with given parameter\
} {Vector and measurement Commands}
proc pntc {curv u} {
upvar \#0 $curv c
cvalue c $u x y z
return "[dval x] [dval y] [dval z]"
}
help 2dpntc {2dpntc curv2d u
returns coordinates of 2D point on 2D curve with given parameter\
} {Vector and measurement Commands}
proc 2dpntc {curv2d u} {
upvar \#0 $curv2d c
2dcvalue c $u x y
return "[dval x] [dval y]"
}
help pntsu {pntsu surf u v
returns coordinates of point on surface with given parameters\
} {Vector and measurement Commands}
proc pntsu {surf u v} {
upvar \#0 $surf s
svalue s $u $v x y z
return "[dval x] [dval y] [dval z]"
}
help pntcons {pntcons curv2d surf u
returns coordinates of point on surface defined by
point on 2D curve with given parameter\
} {Vector and measurement Commands}
proc pntcons {curv2d surf u} {
upvar \#0 $curv2d c $surf s
2dcvalue c $u u0 v0
svalue s u0 v0 x y z
return "[dval x] [dval y] [dval z]"
}
help pnt {pnt point_or_vertex
returns coordinates of point in the given Draw variable of type point or vertex\
} {Vector and measurement Commands}
proc pnt var {
upvar \#0 $var v
set type [dtyp v]
set pp v
if {[lindex $type 1] == "VERTEX"} {
mkpoint p v
set pp p
set type "point"
}
if {$type == "point"} {
if [catch {coord $pp x y z}] {
if ![catch {coord $pp x y}] {
return "[dval x] [dval y]"
}
} else {
return "[dval x] [dval y] [dval z]"
}
}
}
help drseg {drseg name x1 y1 z1 x2 y2 z2
creates a trimmed line between two points\
} {Vector and measurement Commands}
proc drseg {name x1 y1 z1 x2 y2 z2} {
set x [uplevel dval $x1]
set y [uplevel dval $y1]
set z [uplevel dval $z1]
set dx [uplevel dval ($x2)-($x1)]
set dy [uplevel dval ($y2)-($y1)]
set dz [uplevel dval ($z2)-($z1)]
set len [module $dx $dy $dz]
uplevel line $name $x $y $z $dx $dy $dz
uplevel trim $name $name 0 $len
}
help 2ddrseg {2ddrseg name x1 y1 x2 y2
creates a trimmed 2D line between two 2D points\
} {Vector and measurement Commands}
proc 2ddrseg {name x1 y1 x2 y2} {
set x [uplevel dval $x1]
set y [uplevel dval $y1]
set dx [uplevel dval ($x2)-($x1)]
set dy [uplevel dval ($y2)-($y1)]
set len [2dmodule $dx $dy]
uplevel line $name $x $y $dx $dy
uplevel trim $name $name 0 $len
}
help mpick {show coordinates at mouse click\
} {Vector and measurement Commands}
proc mpick {} {
puts "Pick position"
pick id x1 y1 z1 b
concat [dval x1] [dval y1] [dval z1]
}
help mdist {compute distance between two points of mouse clicks\
} {Vector and measurement Commands}
proc mdist {} {
puts "Pick first position"
pick id x1 y1 z1 b
puts "Pick second position"
pick id x2 y2 z2 b
dval sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2))
}