Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
gmsh
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Larry Price
gmsh
Commits
60daa192
Commit
60daa192
authored
17 years ago
by
Christophe Geuzaine
Browse files
Options
Downloads
Patches
Plain Diff
more work on fm
parent
46f1a33f
No related branches found
No related tags found
No related merge requests found
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
Fltk/GUI_Projection.cpp
+95
-92
95 additions, 92 deletions
Fltk/GUI_Projection.cpp
Fltk/GUI_Projection.h
+8
-3
8 additions, 3 deletions
Fltk/GUI_Projection.h
with
103 additions
and
95 deletions
Fltk/GUI_Projection.cpp
+
95
−
92
View file @
60daa192
...
...
@@ -18,8 +18,8 @@ uvPlot::uvPlot(int x, int y, int w, int h, const char *l)
ColorTable_Recompute
(
&
_colorTable
);
}
void
uvPlot
::
fill
(
std
::
vector
<
double
>
&
u
,
std
::
vector
<
double
>
&
v
,
std
::
vector
<
double
>
&
f
)
void
uvPlot
::
set
(
std
::
vector
<
double
>
&
u
,
std
::
vector
<
double
>
&
v
,
std
::
vector
<
std
::
complex
<
double
>
>
&
f
)
{
_u
.
clear
();
_v
.
clear
();
...
...
@@ -33,8 +33,8 @@ void uvPlot::fill(std::vector<double> &u, std::vector<double> &v,
_u
.
push_back
(
u
[
i
]);
_v
.
push_back
(
v
[
i
]);
_f
.
push_back
(
f
[
i
]);
_dmin
=
std
::
min
(
_dmin
,
f
[
i
]);
_dmax
=
std
::
max
(
_dmax
,
f
[
i
]);
_dmin
=
std
::
min
(
_dmin
,
f
[
i
]
.
real
()
);
_dmax
=
std
::
max
(
_dmax
,
f
[
i
]
.
real
()
);
}
}
}
...
...
@@ -70,7 +70,7 @@ void uvPlot::draw()
for
(
unsigned
int
i
=
0
;
i
<
_u
.
size
();
i
++
){
int
x
=
(
int
)(
_u
[
i
]
*
pw
);
int
y
=
(
int
)(
_v
[
i
]
*
ph
);
color
(
_f
[
i
]);
color
(
_f
[
i
]
.
real
()
);
fl_rect
(
x
,
y
,
3
,
3
);
}
...
...
@@ -167,7 +167,7 @@ projectionEditor::projectionEditor(std::vector<FProjectionFace*> &faces)
{
// construct GUI in terms of standard sizes
const
int
BH
=
2
*
GetFontSize
()
+
1
,
BB
=
7
*
GetFontSize
(),
WB
=
7
;
const
int
width
=
(
int
)(
3.5
*
BB
),
height
=
2
2
*
BH
;
const
int
width
=
(
int
)(
3.5
*
BB
),
height
=
2
4
*
BH
;
// create all widgets (we construct this once, we never deallocate!)
_window
=
new
Dialog_Window
(
width
,
height
,
"Reparameterize"
);
...
...
@@ -188,6 +188,7 @@ projectionEditor::projectionEditor(std::vector<FProjectionFace*> &faces)
}
o
->
end
();
{
Fl_Toggle_Button
*
b1
=
new
Fl_Toggle_Button
(
width
-
WB
-
3
*
BB
/
2
,
WB
,
3
*
BB
/
2
,
BH
,
"Hide unselected"
);
b1
->
callback
(
hide_cb
);
...
...
@@ -195,6 +196,7 @@ projectionEditor::projectionEditor(std::vector<FProjectionFace*> &faces)
Fl_Button
*
b2
=
new
Fl_Button
(
width
-
WB
-
3
*
BB
/
2
,
WB
+
BH
,
3
*
BB
/
2
,
BH
,
"Save selection"
);
b2
->
callback
(
save_cb
,
this
);
}
const
int
brw
=
(
int
)(
1.25
*
BB
);
...
...
@@ -210,29 +212,29 @@ projectionEditor::projectionEditor(std::vector<FProjectionFace*> &faces)
int
hard
=
8
;
hardEdges
[
0
]
=
new
Fl_Toggle_Button
(
WB
,
3
*
WB
+
9
*
BH
+
hard
,
hard
,
height
-
7
*
WB
-
1
3
*
BH
-
2
*
hard
);
hard
,
height
-
8
*
WB
-
1
4
*
BH
-
2
*
hard
);
hardEdges
[
1
]
=
new
Fl_Toggle_Button
(
width
-
WB
-
hard
,
3
*
WB
+
9
*
BH
+
hard
,
hard
,
height
-
7
*
WB
-
1
3
*
BH
-
2
*
hard
);
hard
,
height
-
8
*
WB
-
1
4
*
BH
-
2
*
hard
);
hardEdges
[
2
]
=
new
Fl_Toggle_Button
(
WB
+
hard
,
3
*
WB
+
9
*
BH
,
width
-
2
*
WB
-
2
*
hard
,
hard
);
hardEdges
[
3
]
=
new
Fl_Toggle_Button
(
WB
+
hard
,
height
-
4
*
WB
-
4
*
BH
-
hard
,
hardEdges
[
3
]
=
new
Fl_Toggle_Button
(
WB
+
hard
,
height
-
5
*
WB
-
5
*
BH
-
hard
,
width
-
2
*
WB
-
2
*
hard
,
hard
);
for
(
int
i
=
0
;
i
<
4
;
i
++
){
hardEdges
[
i
]
->
tooltip
(
"Push to mark edge as `hard'"
);
}
_uvPlot
=
new
uvPlot
(
WB
+
hard
,
3
*
WB
+
9
*
BH
+
hard
,
width
-
2
*
WB
-
2
*
hard
,
height
-
7
*
WB
-
1
3
*
BH
-
2
*
hard
);
width
-
2
*
WB
-
2
*
hard
,
height
-
8
*
WB
-
1
4
*
BH
-
2
*
hard
);
_uvPlot
->
end
();
modes
[
0
]
=
new
Fl_Value_Input
(
WB
,
height
-
3
*
WB
-
4
*
BH
,
BB
/
2
,
BH
);
modes
[
0
]
=
new
Fl_Value_Input
(
WB
,
height
-
4
*
WB
-
5
*
BH
,
BB
/
2
,
BH
);
modes
[
0
]
->
tooltip
(
"Number of Fourier modes along u"
);
modes
[
1
]
=
new
Fl_Value_Input
(
WB
+
BB
/
2
,
height
-
3
*
WB
-
4
*
BH
,
BB
/
2
,
BH
,
modes
[
1
]
=
new
Fl_Value_Input
(
WB
+
BB
/
2
,
height
-
4
*
WB
-
5
*
BH
,
BB
/
2
,
BH
,
"Fourier modes"
);
modes
[
1
]
->
tooltip
(
"Number of Fourier modes along v"
);
modes
[
2
]
=
new
Fl_Value_Input
(
WB
,
height
-
3
*
WB
-
3
*
BH
,
BB
/
2
,
BH
);
modes
[
2
]
=
new
Fl_Value_Input
(
WB
,
height
-
4
*
WB
-
4
*
BH
,
BB
/
2
,
BH
);
modes
[
2
]
->
tooltip
(
"Number of Chebyshev modes along u"
);
modes
[
3
]
=
new
Fl_Value_Input
(
WB
+
BB
/
2
,
height
-
3
*
WB
-
3
*
BH
,
BB
/
2
,
BH
,
modes
[
3
]
=
new
Fl_Value_Input
(
WB
+
BB
/
2
,
height
-
4
*
WB
-
4
*
BH
,
BB
/
2
,
BH
,
"Chebyshev modes"
);
modes
[
3
]
->
tooltip
(
"Number of Chebyshev modes along v"
);
for
(
int
i
=
0
;
i
<
4
;
i
++
){
...
...
@@ -243,32 +245,47 @@ projectionEditor::projectionEditor(std::vector<FProjectionFace*> &faces)
modes
[
i
]
->
align
(
FL_ALIGN_RIGHT
);
}
int
s
=
width
-
4
*
WB
-
3
*
BB
/
2
;
Fl_Button
*
b3
=
new
Fl_Button
(
width
-
WB
-
s
/
2
,
height
-
3
*
WB
-
4
*
BH
,
s
/
2
,
2
*
BH
,
"Generate
\n
Patch"
);
b3
->
callback
(
compute_cb
,
this
);
{
Fl_Button
*
b
=
new
Fl_Button
(
width
-
WB
-
BB
,
height
-
4
*
WB
-
5
*
BH
,
BB
,
2
*
BH
,
"Generate
\n
Patch"
);
b
->
callback
(
compute_cb
,
this
);
}
new
Fl_Box
(
WB
,
height
-
2
*
WB
-
2
*
BH
,
BB
/
2
,
BH
,
"Delete:"
);
Fl_Button
*
b4
=
new
Fl_Button
(
WB
+
BB
/
2
,
height
-
2
*
WB
-
2
*
BH
,
BB
/
2
,
BH
,
"last"
);
b4
->
callback
(
delete_cb
,
(
void
*
)
"last"
);
Fl_Button
*
b5
=
new
Fl_Button
(
WB
+
BB
,
height
-
2
*
WB
-
2
*
BH
,
BB
/
2
,
BH
,
"select"
);
b5
->
callback
(
delete_cb
,
(
void
*
)
"select"
);
{
int
bb
=
(
int
)(
0.37
*
BB
);
new
Fl_Box
(
WB
,
height
-
3
*
WB
-
3
*
BH
,
BB
/
2
,
BH
,
"Delete:"
);
Fl_Button
*
b1
=
new
Fl_Button
(
WB
+
BB
/
2
,
height
-
3
*
WB
-
3
*
BH
,
bb
,
BH
,
"last"
);
b1
->
callback
(
action_cb
,
(
void
*
)
"delete_last"
);
Fl_Button
*
b2
=
new
Fl_Button
(
WB
+
BB
/
2
+
bb
,
height
-
3
*
WB
-
3
*
BH
,
bb
,
BH
,
"all"
);
b2
->
callback
(
action_cb
,
(
void
*
)
"delete_all"
);
Fl_Button
*
b3
=
new
Fl_Button
(
WB
+
BB
/
2
+
2
*
bb
,
height
-
3
*
WB
-
3
*
BH
,
bb
,
BH
,
"sel."
);
b3
->
callback
(
action_cb
,
(
void
*
)
"delete_select"
);
}
Fl_Button
*
b6
=
new
Fl_Button
(
2
*
WB
+
3
*
BB
/
2
,
height
-
2
*
WB
-
2
*
BH
,
s
/
2
,
BH
,
"Blend"
);
{
int
bb
=
(
int
)(
0.37
*
BB
);
int
s
=
width
-
WB
-
BB
/
2
-
3
*
bb
;
new
Fl_Box
(
s
,
height
-
3
*
WB
-
3
*
BH
,
BB
/
2
,
BH
,
"Save:"
);
Fl_Button
*
b1
=
new
Fl_Button
(
s
+
BB
/
2
,
height
-
3
*
WB
-
3
*
BH
,
bb
,
BH
,
"last"
);
b1
->
callback
(
action_cb
,
(
void
*
)
"save_last"
);
Fl_Button
*
b2
=
new
Fl_Button
(
s
+
BB
/
2
+
bb
,
height
-
3
*
WB
-
3
*
BH
,
bb
,
BH
,
"all"
);
b2
->
callback
(
action_cb
,
(
void
*
)
"save_all"
);
Fl_Button
*
b3
=
new
Fl_Button
(
s
+
BB
/
2
+
2
*
bb
,
height
-
3
*
WB
-
3
*
BH
,
bb
,
BH
,
"sel."
);
b3
->
callback
(
action_cb
,
(
void
*
)
"save_select"
);
}
Fl_Button
*
b7
=
new
Fl_Button
(
3
*
WB
+
3
*
BB
/
2
+
s
/
2
,
height
-
2
*
WB
-
2
*
BH
,
s
/
2
,
BH
,
"Intersect"
);
{
Fl_Button
*
b1
=
new
Fl_Button
(
WB
,
height
-
2
*
WB
-
2
*
BH
,
BB
,
BH
,
"Blend"
);
Fl_Button
*
b2
=
new
Fl_Button
(
2
*
WB
+
BB
,
height
-
2
*
WB
-
2
*
BH
,
BB
,
BH
,
"Intersect"
);
}
Fl_Button
*
b8
=
new
Fl_Button
(
width
-
WB
-
BB
,
height
-
WB
-
BH
,
BB
,
BH
,
"Cancel"
);
b8
->
callback
(
close_cb
,
_window
);
Fl_Button
*
b
=
new
Fl_Button
(
width
-
WB
-
BB
,
height
-
WB
-
BH
,
BB
,
BH
,
"Cancel"
);
b
->
callback
(
close_cb
,
_window
);
_window
->
end
();
_window
->
hotspot
(
_window
);
_window
->
resizable
(
_uvPlot
);
_window
->
size_range
(
width
,
(
int
)(
0.
7
5
*
height
));
_window
->
size_range
(
width
,
(
int
)(
0.
8
5
*
height
));
}
int
projectionEditor
::
getSelectionMode
()
...
...
@@ -299,15 +316,6 @@ void browse_cb(Fl_Widget *w, void *data)
projection
*
p
=
e
->
getCurrentProjection
();
if
(
p
){
/*
if(!GMODEL->faceByTag(p->face->tag())){
// the projection face is not in the model: add it and reset all
// selections
GMODEL->add(p->face);
e->getEntities().clear();
e->getElements().clear();
}
*/
p
->
face
->
setVisibility
(
true
);
p
->
group
->
show
();
}
...
...
@@ -340,7 +348,8 @@ void update_cb(Fl_Widget *w, void *data)
p
->
face
->
computeGraphicsRep
(
64
,
64
);
// FIXME: hardcoded for now!
// project all selected points and update u,v display
std
::
vector
<
double
>
u
,
v
,
f
;
std
::
vector
<
double
>
u
,
v
;
std
::
vector
<
std
::
complex
<
double
>
>
f
;
std
::
vector
<
GEntity
*>
&
ent
(
e
->
getEntities
());
for
(
unsigned
int
i
=
0
;
i
<
ent
.
size
();
i
++
){
if
(
ent
[
i
]
->
getSelection
()){
...
...
@@ -359,7 +368,7 @@ void update_cb(Fl_Widget *w, void *data)
}
}
// loop over elements and do the same thing
e
->
uv
()
->
fill
(
u
,
v
,
f
);
e
->
uv
()
->
set
(
u
,
v
,
f
);
}
Draw
();
...
...
@@ -498,32 +507,14 @@ void compute_cb(Fl_Widget *w, void *data)
projection
*
p
=
e
->
getCurrentProjection
();
if
(
p
){
ProjectionSurface
*
ps
=
p
->
face
->
GetProjectionSurface
();
// project all selected points and update u,v display
// get the projection data
std
::
vector
<
double
>
u
,
v
;
std
::
vector
<
std
::
complex
<
double
>
>
f
;
std
::
vector
<
GEntity
*>
&
ent
(
e
->
getEntities
());
for
(
unsigned
int
i
=
0
;
i
<
ent
.
size
();
i
++
){
GVertex
*
ve
=
dynamic_cast
<
GVertex
*>
(
ent
[
i
]);
if
(
!
ve
){
Msg
(
GERROR
,
"Problem in point selection processing"
);
}
else
{
double
uu
,
vv
;
ps
->
OrthoProjectionOnSurface
(
ve
->
x
(),
ve
->
y
(),
ve
->
z
(),
uu
,
vv
);
u
.
push_back
(
uu
);
v
.
push_back
(
vv
);
double
p
[
3
],
n
[
3
];
ps
->
F
(
u
[
i
],
v
[
i
],
p
[
0
],
p
[
1
],
p
[
2
]);
ps
->
GetUnitNormal
(
u
[
i
],
v
[
i
],
n
[
0
],
n
[
1
],
n
[
2
]);
f
.
push_back
((
ve
->
x
()
-
p
[
0
])
*
n
[
0
]
+
(
ve
->
y
()
-
p
[
1
])
*
n
[
1
]
+
(
ve
->
z
()
-
p
[
2
])
*
n
[
2
]);
}
}
e
->
uv
()
->
get
(
u
,
v
,
f
);
if
(
f
.
empty
())
return
;
// create the Fourier faces (with boundaries)
ProjectionSurface
*
ps
=
p
->
face
->
GetProjectionSurface
();
if
(
ps
->
IsUPeriodic
())
{
Patch
*
patchL
=
new
FPatch
(
0
,
ps
->
clone
(),
u
,
v
,
f
,
3
,(
int
)(
e
->
modes
[
0
]
->
value
()),
...
...
@@ -855,7 +846,6 @@ void compute_cb(Fl_Widget *w, void *data)
}
// IO Test Code
char
*
filename
=
"patches.fm"
;
FILE
*
fp
=
fopen
(
filename
,
"w"
);
...
...
@@ -873,7 +863,6 @@ void compute_cb(Fl_Widget *w, void *data)
}
FM_Reader
*
reader
=
new
FM_Reader
(
filename
);
// End Test
Draw
();
...
...
@@ -882,45 +871,59 @@ void compute_cb(Fl_Widget *w, void *data)
void
delete_fourier
(
GFace
*
gf
)
{
if
(
gf
->
getNativeType
()
!=
GEntity
::
FourierModel
)
return
;
/*
std
::
list
<
GVertex
*>
vertices
=
gf
->
vertices
();
for
(
std
::
list
<
GVertex
*>::
iterator
it
=
vertices
.
begin
();
it
!=
vertices
.
end
();
it
++
){
GMODEL
->
remove
(
*
it
);
delete *it;
//
delete *it;
}
std
::
list
<
GEdge
*>
edges
=
gf
->
edges
();
for
(
std
::
list
<
GEdge
*>::
iterator
it
=
edges
.
begin
();
it
!=
edges
.
end
();
it
++
){
GMODEL
->
remove
(
*
it
);
delete *it;
//
delete *it;
}
GMODEL
->
remove
(
gf
);
delete gf;
*/
//delete gf;
}
void
delete
_cb
(
Fl_Widget
*
w
,
void
*
data
)
void
action
_cb
(
Fl_Widget
*
w
,
void
*
data
)
{
char
*
str
=
(
char
*
)
data
;
if
(
!
strcmp
(
str
,
"last"
)){
std
::
string
what
(
(
char
*
)
data
)
;
std
::
vector
<
GFace
*>
faces
;
if
(
what
==
"delete_last"
||
what
==
"save_last"
){
int
id
=
-
1
;
for
(
GModel
::
fiter
it
=
GMODEL
->
firstFace
();
it
!=
GMODEL
->
lastFace
();
it
++
)
if
((
*
it
)
->
getNativeType
()
==
GEntity
::
FourierModel
)
id
=
std
::
max
(
id
,
(
*
it
)
->
tag
());
if
(
id
>
0
)
faces
.
push_back
(
GMODEL
->
faceByTag
(
id
));
}
else
{
Msg
(
ONSCREEN
,
"Select Surface
\n
"
);
else
if
(
what
==
"delete_all"
||
what
==
"save_all"
){
for
(
GModel
::
fiter
it
=
GMODEL
->
firstFace
();
it
!=
GMODEL
->
lastFace
();
it
++
)
if
((
*
it
)
->
getNativeType
()
==
GEntity
::
FourierModel
)
faces
.
push_back
(
*
it
);
}
else
if
(
what
==
"delete_select"
||
what
==
"select_all"
){
Msg
(
ONSCREEN
,
"Select Surface
\n
[Press 'e' to end selection 'q' to abort]"
);
std
::
vector
<
GVertex
*>
vertices
;
std
::
vector
<
GEdge
*>
edges
;
std
::
vector
<
GFace
*>
faces
;
std
::
vector
<
GRegion
*>
regions
;
std
::
vector
<
MElement
*>
elements
;
char
ib
=
SelectEntity
(
ENT_SURFACE
,
vertices
,
edges
,
faces
,
regions
,
elements
);
if
(
ib
==
'l'
){
for
(
unsigned
int
i
=
0
;
i
<
faces
.
size
();
i
++
)
delete_fourier
(
faces
[
i
]);
}
Draw
();
if
(
ib
==
'l'
)
faces
.
insert
(
faces
.
end
(),
faces
.
begin
(),
faces
.
end
());
Msg
(
ONSCREEN
,
""
);
}
if
(
what
==
"delete_last"
||
what
==
"delete_all"
||
what
==
"delete_select"
){
for
(
unsigned
int
i
=
0
;
i
<
faces
.
size
();
i
++
)
delete_fourier
(
faces
[
i
]);
}
else
{
// call IO code
}
Draw
();
}
void
mesh_parameterize_cb
(
Fl_Widget
*
w
,
void
*
data
)
...
...
This diff is collapsed.
Click to expand it.
Fltk/GUI_Projection.h
+
8
−
3
View file @
60daa192
...
...
@@ -33,18 +33,23 @@ void close_cb(Fl_Widget *w, void *data);
void
hide_cb
(
Fl_Widget
*
w
,
void
*
data
);
void
save_cb
(
Fl_Widget
*
w
,
void
*
data
);
void
compute_cb
(
Fl_Widget
*
w
,
void
*
data
);
void
delete
_cb
(
Fl_Widget
*
w
,
void
*
data
);
void
action
_cb
(
Fl_Widget
*
w
,
void
*
data
);
class
uvPlot
:
public
Fl_Window
{
private:
std
::
vector
<
double
>
_u
,
_v
,
_f
;
std
::
vector
<
double
>
_u
,
_v
;
std
::
vector
<
std
::
complex
<
double
>
>
_f
;
GmshColorTable
_colorTable
;
double
_dmin
,
_dmax
;
void
color
(
double
d
);
void
draw
();
public:
uvPlot
(
int
x
,
int
y
,
int
w
,
int
h
,
const
char
*
l
=
0
);
void
fill
(
std
::
vector
<
double
>
&
u
,
std
::
vector
<
double
>
&
v
,
std
::
vector
<
double
>
&
f
);
void
set
(
std
::
vector
<
double
>
&
u
,
std
::
vector
<
double
>
&
v
,
std
::
vector
<
std
::
complex
<
double
>
>
&
f
);
void
get
(
std
::
vector
<
double
>
&
u
,
std
::
vector
<
double
>
&
v
,
std
::
vector
<
std
::
complex
<
double
>
>
&
f
)
{
u
=
_u
;
v
=
_v
;
f
=
_f
;
}
};
class
projectionEditor
;
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment