WIP: basic debugging, functionality.

This commit is contained in:
Matthias Koefferlein 2022-03-05 19:42:57 +01:00
parent cd07a21ae3
commit 64406522fe
11 changed files with 543 additions and 128 deletions

View File

@ -1626,6 +1626,54 @@ CODE
nil
end
# %DRC%
# @name region_touch
# @brief Specifies region selected input in "touch mode"
# @synopsis region_touch(args)
# See \Source#touching for a description of that function.
#
# The following code will select shapes touching a 500x600 micron rectangle (lower left corner at 0,0)
# from the input layout. The shapes will not be clipped:
#
# @code
# region_touch(0.mm, 0.mm, 0.5.mm, 0.6.mm)
# # shapes will now be the ones touching the rectangular region
# l1 = input(1, 0)
# @/code
#
# To remove this condition, call "region_touch" without any arguments.
def region_touch(*args)
self._context("region_touch") do
@def_source = layout.touching(*args)
end
nil
end
# %DRC%
# @name region_overlap
# @brief Specifies region selected input in "overlap mode"
# @synopsis region_overlap(args)
# See \Source#overlapping for a description of that function.
#
# The following code will select shapes overlapping a 500x600 micron rectangle (lower left corner at 0,0)
# from the input layout. The shapes will not be clipped:
#
# @code
# region_overlapping(0.mm, 0.mm, 0.5.mm, 0.6.mm)
# # shapes will now be the ones overlapping the rectangular region
# l1 = input(1, 0)
# @/code
#
# To remove this condition, call "region_overlapping" without any arguments.
def region_overlap(*args)
self._context("region_overlap") do
@def_source = layout.overlapping(*args)
end
nil
end
# %DRC%
# @name global_transform
# @brief Gets or sets a global transformation

View File

@ -35,8 +35,8 @@
namespace db
{
struct LayerProperties;
class Layout;
struct LayerProperties;
}
namespace lay

View File

@ -358,7 +358,44 @@
<number>0</number>
</property>
<item>
<widget class="lay::D25ViewWidget" name="d25_view"/>
<widget class="QFrame" name="frame_3">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QSplitter" name="splitter">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<widget class="lay::D25ViewWidget" name="d25_view">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
<widget class="QWidget" name="widget" native="true"/>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>

View File

@ -42,9 +42,11 @@ module D25
@zstack = []
# clip to layout view
if RBA::LayoutView::current
self.clip(RBA::LayoutView::current.box)
end
if ! RBA::LayoutView::current
raise "No layout loaded for running 2.5d view on"
end
self.region_overlap(RBA::LayoutView::current.box)
end
@ -126,7 +128,7 @@ module D25
raise("No layer specified")
end
info = D25ZInfo::new(layer.data, zstart, zstop, @display || D25Display::new)
info = D25ZInfo::new(layer, zstart, zstop, @display || D25Display::new)
@zstack << info
return info
@ -137,78 +139,91 @@ module D25
def display(*args, &block)
display = D25Display::new
begin
args.each do |a|
display = D25Display::new
@display = display
if a.is_a?(D25ZInfo)
args.each do |a|
@zstack.each do |z|
if z == a
z.display = display
if a.is_a?(D25ZInfo)
@zstack.each do |z|
if z == a
z.display = display
end
end
end
elsif a.is_a?(Hash)
elsif a.is_a?(Hash)
hollow_fill = 0xffffffff
hollow_fill = 0xffffffff
if a[:color]
if !a[:color].is_a?(0xffffff.class)
raise("'color' must be a color value (an integer)")
if a[:color]
if !a[:color].is_a?(0xffffff.class)
raise("'color' must be a color value (an integer)")
end
display.fill = a[:color]
display.frame = a[:color]
end
display.fill = a[:color]
display.frame = a[:color]
end
if a[:frame]
if !a[:frame].is_a?(0xffffff.class)
raise("'frame' must be a color value (an integer)")
if a[:frame]
if !a[:frame].is_a?(0xffffff.class)
raise("'frame' must be a color value (an integer)")
end
display.frame = a[:frame]
end
display.frame = a[:frame]
end
if a[:fill]
if !a[:fill].is_a?(0xffffff.class)
raise("'fill' must be a color value (an integer)")
if a[:fill]
if !a[:fill].is_a?(0xffffff.class)
raise("'fill' must be a color value (an integer)")
end
display.fill = a[:fill]
end
display.fill = a[:fill]
end
if a[:hollow]
if a[:hollow]
display.fill = hollow_fill
if a[:hollow]
display.fill = hollow_fill
end
end
end
if a[:like]
li = nil
if a[:like].is_a?(String)
li = RBA::LayerInfo::from_string(a[:like])
elsif a[:like].is_a?(RBA::LayerInfo)
li = a[:like]
else
raise("'like' must be a string or LayerInfo object")
if a[:like]
li = nil
if a[:like].is_a?(String)
li = RBA::LayerInfo::from_string(a[:like])
elsif a[:like].is_a?(RBA::LayerInfo)
li = a[:like]
else
raise("'like' must be a string or LayerInfo object")
end
display.like = li
end
display.like = li
end
invalid_keys = a.keys.select { |k| ![ :fill, :frame, :color, :hollow, :like ].member?(k) }
if invalid_keys.size > 0
raise("Keyword argument(s) not understood: #{invalid_keys.collect(&:to_s).join(',')}")
end
invalid_keys = a.keys.select { |k| ![ :fill, :frame, :color, :hollow, :like ].member?(k) }
if invalid_keys.size > 0
raise("Keyword argument(s) not understood: #{invalid_keys.collect(&:to_s).join(',')}")
end
else
raise("Argument not understood: #{a.inspect}")
else
raise("Argument not understood: #{a.inspect}")
end
end
yield
ensure
@display = nil
end
end
def _check
if @zstack.empty?
raise("No z calls made in 2.5d script")
end
end
def _finish(final = true)
if final && @zstack.empty?
raise("No z calls made in 2.5d script")
end
super(final)
if final
@ -217,6 +232,8 @@ module D25
begin
view.clear
displays = {}
@zstack.each do |z|
@ -227,7 +244,7 @@ module D25
display = zz[0].display
view.open_display(display.frame, display.fill, display.like)
zz.each do |z|
view.entry(z.layer, z.start, z.zstop)
view.entry(z.layer.data, self.dbu, z.zstart, z.zstop)
end
view.close_display
end
@ -235,6 +252,7 @@ module D25
view.finish
rescue => ex
view.clear
view.close
raise ex
end

View File

@ -50,6 +50,8 @@ module D25
end
@d25._check
nil
end

View File

@ -0,0 +1,85 @@
/*
KLayout Layout Viewer
Copyright (C) 2006-2022 Matthias Koefferlein
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "gsiDecl.h"
#include "gsiDeclBasic.h"
#include "layD25View.h"
#include "layLayoutView.h"
#include "dbLayerProperties.h"
#include "dbRegion.h"
#include <limits>
#if defined(HAVE_QTBINDINGS)
# include "gsiQtGuiExternals.h"
# include "gsiQtWidgetsExternals.h"
FORCE_LINK_GSI_QTGUI
FORCE_LINK_GSI_QTWIDGETS // for Qt5
#else
# define QT_EXTERNAL_BASE(x)
#endif
namespace gsi
{
static lay::D25View *open_d25_view (lay::LayoutView *view)
{
return lay::D25View::open (view);
}
ClassExt<lay::LayoutView> decl_LayoutViewExt (
gsi::method_ext ("open_d25_view", &open_d25_view,
"@brief Opens the 2.5d view window and returns a reference to the D25View object.\n"
"This method has been introduced in version 0.28.\n"
)
);
Class<lay::D25View> decl_D25View (QT_EXTERNAL_BASE (QDialog) "lay", "D25View",
gsi::method ("clear", &lay::D25View::clear,
"@brief Clears all display entries in the view"
) +
gsi::method ("open_display", &lay::D25View::open_display, gsi::arg ("frame_color"), gsi::arg ("fill_color"), gsi::arg ("like"),
"@brief Creates a new display group"
) +
gsi::method ("entry", &lay::D25View::entry, gsi::arg ("data"), gsi::arg ("dbu"), gsi::arg ("zstart"), gsi::arg ("zstop"),
"@brief Creates a new display entry in the group opened with \\open_display"
) +
gsi::method ("close_display", &lay::D25View::close_display,
"@brief Finishes the display group"
) +
gsi::method ("finish", &lay::D25View::finish,
"@brief Finishes the view - call this after the display groups have been created"
) +
gsi::method ("close", &lay::D25View::close,
"@brief Closes the view"
),
"@brief The 2.5d View Dialog\n"
"\n"
"This class is used internally to implement the 2.5d feature.\n"
);
}

View File

@ -43,19 +43,19 @@ D25View::D25View (lay::Dispatcher *root, lay::LayoutView *view)
mp_ui->d25_view->setFocusPolicy (Qt::StrongFocus);
mp_ui->d25_view->setFocus ();
connect (mp_ui->fit_back, SIGNAL (clicked ()), this, SLOT (fit_button_clicked ()));
connect (mp_ui->fit_front, SIGNAL (clicked ()), this, SLOT (fit_button_clicked ()));
connect (mp_ui->fit_left, SIGNAL (clicked ()), this, SLOT (fit_button_clicked ()));
connect (mp_ui->fit_right, SIGNAL (clicked ()), this, SLOT (fit_button_clicked ()));
connect (mp_ui->fit_top, SIGNAL (clicked ()), this, SLOT (fit_button_clicked ()));
connect (mp_ui->fit_bottom, SIGNAL (clicked ()), this, SLOT (fit_button_clicked ()));
connect (mp_ui->zoom_slider, SIGNAL (valueChanged (int)), this, SLOT (scale_slider_changed (int)));
connect (mp_ui->vzoom_slider, SIGNAL (valueChanged (int)), this, SLOT (vscale_slider_changed (int)));
connect (mp_ui->zoom_factor, SIGNAL (editingFinished ()), this, SLOT (scale_value_edited ()));
connect (mp_ui->vzoom_factor, SIGNAL (editingFinished ()), this, SLOT (vscale_value_edited ()));
connect (mp_ui->d25_view, SIGNAL (scale_factor_changed (double)), this, SLOT (scale_factor_changed (double)));
connect (mp_ui->d25_view, SIGNAL (vscale_factor_changed (double)), this, SLOT (vscale_factor_changed (double)));
connect (mp_ui->d25_view, SIGNAL (init_failed ()), this, SLOT (init_failed ()));
connect (mp_ui->fit_back, SIGNAL (clicked()), this, SLOT (fit_button_clicked()));
connect (mp_ui->fit_front, SIGNAL (clicked()), this, SLOT (fit_button_clicked()));
connect (mp_ui->fit_left, SIGNAL (clicked()), this, SLOT (fit_button_clicked()));
connect (mp_ui->fit_right, SIGNAL (clicked()), this, SLOT (fit_button_clicked()));
connect (mp_ui->fit_top, SIGNAL (clicked()), this, SLOT (fit_button_clicked()));
connect (mp_ui->fit_bottom, SIGNAL (clicked()), this, SLOT (fit_button_clicked()));
connect (mp_ui->zoom_slider, SIGNAL (valueChanged(int)), this, SLOT (scale_slider_changed(int)));
connect (mp_ui->vzoom_slider, SIGNAL (valueChanged(int)), this, SLOT (vscale_slider_changed(int)));
connect (mp_ui->zoom_factor, SIGNAL (editingFinished()), this, SLOT (scale_value_edited()));
connect (mp_ui->vzoom_factor, SIGNAL (editingFinished()), this, SLOT (vscale_value_edited()));
connect (mp_ui->d25_view, SIGNAL (scale_factor_changed(double)), this, SLOT (scale_factor_changed(double)));
connect (mp_ui->d25_view, SIGNAL (vscale_factor_changed(double)), this, SLOT (vscale_factor_changed(double)));
connect (mp_ui->d25_view, SIGNAL (init_failed()), this, SLOT (init_failed()));
mp_ui->gl_stack->setCurrentIndex (0);
@ -84,7 +84,7 @@ D25View::cellviews_changed ()
void
D25View::layer_properties_changed (int)
{
mp_ui->d25_view->refresh_view ();
// @@@ mp_ui->d25_view->refresh_view ();
}
void
@ -113,6 +113,71 @@ D25View::menu_activated (const std::string &symbol)
}
}
D25View *
D25View::open (lay::LayoutView *view)
{
D25View *d25_view = view->get_plugin<lay::D25View> ();
if (d25_view) {
d25_view->show ();
d25_view->activateWindow ();
d25_view->raise ();
try {
d25_view->activate ();
} catch (...) {
d25_view->deactivate ();
throw;
}
}
return d25_view;
}
void
D25View::close ()
{
hide ();
}
void
D25View::clear ()
{
mp_ui->d25_view->clear ();
}
void
D25View::open_display (const color_t *frame_color, const color_t *fill_color, const db::LayerProperties *like)
{
mp_ui->d25_view->open_display (frame_color, fill_color, like);
}
void
D25View::close_display ()
{
mp_ui->d25_view->close_display ();
}
void
D25View::entry (const db::Region &data, double dbu, double zstart, double zstop)
{
mp_ui->d25_view->entry (data, dbu, zstart, zstop);
}
void
D25View::finish ()
{
mp_ui->d25_view->finish ();
// @@@ install
mp_ui->d25_view->reset ();
mp_ui->d25_view->set_cam_azimuth (0.0);
mp_ui->d25_view->set_cam_elevation (-initial_elevation);
mp_ui->d25_view->fit ();
}
static QString scale_factor_to_string (double f)
{
return QString (QString::fromUtf8 ("%1")).arg (f, 0, 'g', 3);
@ -198,12 +263,7 @@ D25View::deactivated ()
void
D25View::activated ()
{
bool any = mp_ui->d25_view->attach_view (view ());
if (! any) {
mp_ui->d25_view->attach_view (0);
throw tl::Exception (tl::to_string (tr ("No z data configured for the layers in this view.\nUse \"Tools/Manage Technologies\" to set up a z stack or check if it applies to the layers here.")));
}
mp_ui->d25_view->attach_view (view ());
mp_ui->d25_view->reset ();
mp_ui->d25_view->set_cam_azimuth (0.0);
mp_ui->d25_view->set_cam_elevation (-initial_elevation);

View File

@ -27,6 +27,7 @@
#include "tlObject.h"
#include "layBrowser.h"
#include "layViewOp.h"
namespace Ui
{
@ -38,6 +39,12 @@ namespace lay
class LayoutView;
}
namespace db
{
class Region;
struct LayerProperties;
}
namespace lay
{
@ -54,6 +61,14 @@ public:
virtual void deactivated ();
virtual void activated ();
static D25View *open (lay::LayoutView *view);
void close ();
void clear ();
void open_display (const color_t *frame_color, const color_t *fill_color, const db::LayerProperties *like);
void close_display ();
void entry (const db::Region &data, double dbu, double zstart, double zstop);
void finish ();
protected:
void accept ();
void reject ();

View File

@ -31,6 +31,8 @@
#include "dbPolygonGenerators.h"
#include "dbPolygonTools.h"
#include "dbClip.h"
#include "dbRegion.h"
#include "dbOriginalLayerRegion.h"
#include "tlException.h"
#include "tlProgress.h"
@ -200,6 +202,8 @@ D25ViewWidget::D25ViewWidget (QWidget *parent)
setFormat (format);
m_zmin = m_zmax = 0.0;
m_zset = false;
m_display_open = false;
mp_view = 0;
reset_viewport ();
@ -496,17 +500,146 @@ D25ViewWidget::aspect_ratio () const
return double (width ()) / double (height ());
}
bool
void
D25ViewWidget::clear ()
{
m_layers.clear ();
m_layer_to_info.clear ();
m_vertex_chunks.clear ();
m_line_chunks.clear ();
m_zset = false;
m_zmin = m_zmax = 0.0;
m_display_open = false;
if (! mp_view) {
m_bbox = db::DBox (-1.0, -1.0, 1.0, 1.0);
} else {
m_bbox = mp_view->viewport ().box ();
}
}
static void color_to_gl (color_t color, GLfloat (&gl_color) [4])
{
gl_color[0] = ((color >> 16) & 0xff) / 255.0f;
gl_color[1] = ((color >> 8) & 0xff) / 255.0f;
gl_color[2] = (color & 0xff) / 255.0f;
gl_color[3] = 1.0f;
}
static void color_to_gl (const color_t *color, GLfloat (&gl_color) [4])
{
if (! color) {
for (unsigned int i = 0; i < 4; ++i) {
gl_color [i] = 0.0;
}
} else {
color_to_gl (*color, gl_color);
}
}
static void lp_to_info (const lay::LayerPropertiesNode &lp, D25ViewWidget::LayerInfo &info)
{
color_to_gl (lp.fill_color (true), info.fill_color);
if (lp.dither_pattern (true) == 1 /*hollow*/) {
info.fill_color [3] = 0.0f;
}
color_to_gl (lp.frame_color (true), info.frame_color);
if (lp.frame_color (true) == lp.fill_color (true) && info.fill_color [3] > 0.5) {
// optimize: don't draw wire frame unless required
info.frame_color [3] = 0.0f;
}
info.visible = lp.visible (true);
}
void
D25ViewWidget::open_display (const color_t *frame_color, const color_t *fill_color, const db::LayerProperties *like)
{
m_vertex_chunks.push_back (triangle_chunks_type ());
m_line_chunks.push_back (line_chunks_type ());
LayerInfo info;
info.visible = true;
color_to_gl (frame_color, info.frame_color);
color_to_gl (fill_color, info.fill_color);
info.vertex_chunk = &m_vertex_chunks.back ();
info.line_chunk = &m_line_chunks.back ();
if (like && mp_view) {
for (lay::LayerPropertiesConstIterator lp = mp_view->begin_layers (); ! lp.at_end (); ++lp) {
if (! lp->has_children () && lp->source (true).layer_props ().log_equal (*like)) {
lp_to_info (*lp, info);
break;
}
}
}
m_layers.push_back (info);
m_display_open = true;
}
void
D25ViewWidget::close_display ()
{
m_display_open = false;
}
void
D25ViewWidget::entry (const db::Region &data, double dbu, double zstart, double zstop)
{
tl_assert (m_display_open);
// try to establish a default color from the region's origin if required
const db::OriginalLayerRegion *original_region = dynamic_cast<db::OriginalLayerRegion *> (data.delegate ());
if (mp_view && m_layers.back ().fill_color [3] == 0.0 && m_layers.back ().frame_color [3] == 0.0) {
if (original_region) {
const db::RecursiveShapeIterator *iter = original_region->iter ();
if (iter && iter->layout () && iter->layout ()->is_valid_layer (iter->layer ())) {
db::LayerProperties like = iter->layout ()->get_properties (iter->layer ());
for (lay::LayerPropertiesConstIterator lp = mp_view->begin_layers (); ! lp.at_end (); ++lp) {
if (! lp->has_children () && lp->source (true).layer_props ().log_equal (like)) {
lp_to_info (*lp, m_layers.back ());
break;
}
}
}
} else {
// sequential assignment
lay::color_t color = mp_view->get_palette ().luminous_color_by_index (m_layers.size ());
color_to_gl (color, m_layers.back ().frame_color);
color_to_gl (color, m_layers.back ().fill_color);
}
}
tl::AbsoluteProgress progress (tl::to_string (tr ("Rendering ...")));
render_region (progress, *m_layers.back ().vertex_chunk, *m_layers.back ().line_chunk, data, dbu, db::CplxTrans (dbu).inverted () * m_bbox, zstart, zstop);
}
void
D25ViewWidget::finish ()
{
// @@@
}
void
D25ViewWidget::attach_view (LayoutView *view)
{
mp_view = view;
bool any = prepare_view ();
reset ();
return any;
}
#if 0 // @@@
namespace {
class ZDataCache
@ -578,31 +711,6 @@ namespace {
}
static void color_to_gl (color_t color, GLfloat (&gl_color) [4])
{
gl_color[0] = ((color >> 16) & 0xff) / 255.0f;
gl_color[1] = ((color >> 8) & 0xff) / 255.0f;
gl_color[2] = (color & 0xff) / 255.0f;
gl_color[3] = 1.0f;
}
void
D25ViewWidget::lp_to_info (const lay::LayerPropertiesNode &lp, LayerInfo &info)
{
color_to_gl (lp.fill_color (true), info.color);
if (lp.dither_pattern (true) == 1 /*hollow*/) {
info.color [3] = 0.0f;
}
color_to_gl (lp.frame_color (true), info.frame_color);
if (lp.frame_color (true) == lp.fill_color (true) && info.color [3] > 0.5) {
// optimize: don't draw wire frame unless required
info.frame_color [3] = 0.0f;
}
info.visible = lp.visible (true);
}
bool
D25ViewWidget::prepare_view ()
{
@ -712,6 +820,9 @@ D25ViewWidget::refresh_view ()
refresh ();
}
// -----------------------
#endif
void
D25ViewWidget::render_polygon (D25ViewWidget::triangle_chunks_type &chunks, D25ViewWidget::line_chunks_type &line_chunks, const db::Polygon &poly, double dbu, double zstart, double zstop)
{
@ -792,6 +903,8 @@ D25ViewWidget::render_wall (D25ViewWidget::triangle_chunks_type &chunks, D25View
line_chunks.add (edge.p1 ().x () * dbu, zstop, edge.p1 ().y () * dbu);
}
// @@@
#if 0
void
D25ViewWidget::render_layout (tl::AbsoluteProgress &progress, D25ViewWidget::triangle_chunks_type &chunks, D25ViewWidget::line_chunks_type &line_chunks, const db::Layout &layout, const db::Cell &cell, const db::Box &clip_box, unsigned int layer, double zstart, double zstop)
{
@ -824,6 +937,32 @@ D25ViewWidget::render_layout (tl::AbsoluteProgress &progress, D25ViewWidget::tri
}
}
#endif
void
D25ViewWidget::render_region (tl::AbsoluteProgress &progress, D25ViewWidget::triangle_chunks_type &chunks, D25ViewWidget::line_chunks_type &line_chunks, const db::Region &region, double dbu, const db::Box &clip_box, double zstart, double zstop)
{
std::vector<db::Polygon> poly_heap;
for (db::Region::const_iterator p = region.begin (); !p.at_end (); ++p) {
poly_heap.clear ();
db::clip_poly (*p, clip_box, poly_heap, false /*keep holes*/);
for (std::vector<db::Polygon>::const_iterator p = poly_heap.begin (); p != poly_heap.end (); ++p) {
++progress;
render_polygon (chunks, line_chunks, *p, dbu, zstart, zstop);
for (db::Polygon::polygon_edge_iterator e = p->begin_edge (); ! e.at_end (); ++e) {
render_wall (chunks, line_chunks, *e, dbu, zstart, zstop);
}
}
}
}
static std::pair<double, double> find_grid (double v)
{
@ -1098,8 +1237,8 @@ D25ViewWidget::paintGL ()
glEnableVertexAttribArray (positions);
for (std::vector<LayerInfo>::const_iterator l = m_layers.begin (); l != m_layers.end (); ++l) {
if (l->visible && l->color [3] > 0.5) {
m_shapes_program->setUniformValue ("color", l->color [0], l->color [1], l->color [2], l->color [3]);
if (l->visible && l->fill_color [3] > 0.5) {
m_shapes_program->setUniformValue ("color", l->fill_color [0], l->fill_color [1], l->fill_color [2], l->fill_color [3]);
l->vertex_chunk->draw_to (this, positions, GL_TRIANGLES);
}
}

View File

@ -27,6 +27,7 @@
#include "layD25MemChunks.h"
#include "layD25Camera.h"
#include "layViewOp.h"
#include <QOpenGLWidget>
#include <QOpenGLVertexArrayObject>
@ -41,8 +42,8 @@
namespace db
{
class Layout;
class Cell;
class Region;
struct LayerProperties;
}
namespace tl
@ -78,6 +79,18 @@ class D25ViewWidget
Q_OBJECT
public:
typedef lay::mem_chunks<GLfloat, 1024 * 18> triangle_chunks_type;
typedef lay::mem_chunks<GLfloat, 1024 * 6> line_chunks_type;
struct LayerInfo
{
triangle_chunks_type *vertex_chunk;
line_chunks_type *line_chunk;
GLfloat fill_color [4];
GLfloat frame_color [4];
bool visible;
};
D25ViewWidget (QWidget *parent);
~D25ViewWidget ();
@ -88,8 +101,8 @@ public:
void mouseReleaseEvent (QMouseEvent *event);
void mouseMoveEvent (QMouseEvent *event);
bool attach_view(lay::LayoutView *view);
void refresh_view ();
void attach_view(lay::LayoutView *view);
// @@@ void refresh_view ();
QVector3D hit_point_with_scene(const QVector3D &line_dir);
void refresh ();
@ -129,6 +142,12 @@ public:
return m_error;
}
void clear ();
void open_display (const color_t *frame_color, const color_t *fill_color, const db::LayerProperties *like);
void close_display ();
void entry (const db::Region &data, double dbu, double zstart, double zstop);
void finish ();
signals:
void scale_factor_changed (double f);
void vscale_factor_changed (double f);
@ -143,9 +162,6 @@ public slots:
void fit ();
private:
typedef lay::mem_chunks<GLfloat, 1024 * 18> triangle_chunks_type;
typedef lay::mem_chunks<GLfloat, 1024 * 6> line_chunks_type;
std::unique_ptr<D25InteractionMode> mp_mode;
QOpenGLShaderProgram *m_shapes_program, *m_lines_program, *m_gridplane_program;
std::string m_error;
@ -155,32 +171,26 @@ private:
lay::LayoutView *mp_view;
db::DBox m_bbox;
double m_zmin, m_zmax;
bool m_zset;
bool m_display_open;
std::list<triangle_chunks_type> m_vertex_chunks;
std::list<line_chunks_type> m_line_chunks;
struct LayerInfo {
const triangle_chunks_type *vertex_chunk;
const line_chunks_type *line_chunk;
GLfloat color [4];
GLfloat frame_color [4];
bool visible;
};
std::vector<LayerInfo> m_layers;
std::multimap<std::pair<size_t, size_t>, size_t> m_layer_to_info;
std::multimap<std::pair<size_t, size_t>, size_t> m_layer_to_info; // @@@
void initializeGL ();
void paintGL ();
void resizeGL (int w, int h);
void do_initialize_gl ();
bool prepare_view();
void render_layout (tl::AbsoluteProgress &progress, D25ViewWidget::triangle_chunks_type &vertex_chunks, D25ViewWidget::line_chunks_type &line_chunks, const db::Layout &layout, const db::Cell &cell, const db::Box &clip_box, unsigned int layer, double zstart, double zstop);
// @@@ bool prepare_view();
// @@@ void render_layout (tl::AbsoluteProgress &progress, D25ViewWidget::triangle_chunks_type &vertex_chunks, D25ViewWidget::line_chunks_type &line_chunks, const db::Layout &layout, const db::Cell &cell, const db::Box &clip_box, unsigned int layer, double zstart, double zstop);
void render_region (tl::AbsoluteProgress &progress, D25ViewWidget::triangle_chunks_type &vertex_chunks, D25ViewWidget::line_chunks_type &line_chunks, const db::Region &region, double dbu, const db::Box &clip_box, double zstart, double zstop);
void render_polygon (D25ViewWidget::triangle_chunks_type &vertex_chunks, D25ViewWidget::line_chunks_type &line_chunks, const db::Polygon &poly, double dbu, double zstart, double zstop);
void render_wall (D25ViewWidget::triangle_chunks_type &vertex_chunks, D25ViewWidget::line_chunks_type &line_chunks, const db::Edge &poly, double dbu, double zstart, double zstop);
void reset_viewport ();
static void lp_to_info (const lay::LayerPropertiesNode &lp, D25ViewWidget::LayerInfo &info);
};
}

View File

@ -16,6 +16,7 @@ HEADERS = \
layD25Camera.h
SOURCES = \
gsiDeclLayD25View.cc \
layD25View.cc \
layD25ViewWidget.cc \
layD25Plugin.cc \