SVGファイルをシンボルに使う

Pythonコンソールにて

[code]
dict = {}
dict[‘fill’] = ‘#FFFF00’
dict[‘name’] = ‘c:\\work\\abc.svg’
dict[‘size’] = ’10’
sl = QgsSvgMarkerSymbolLayer.create(dict)
sym = QgsSymbol.defaultSymbol(QgsWkbTypes.PointGeometry)
sym.changeSymbolLayer(0, sl)
renderer = QgsSingleSymbolRenderer(sym)
iface.activeLayer().setRenderer(renderer)
iface.activeLayer().triggerRepaint()
[/code]

QGIS Pythonプラグインで起動時に地図を表示

Pythonで作成したプラグインで起動時に地図を表示すると、
起動後「現在のプロジェクトを保存しますか」の問い合わせメッセージが表示される。

サンプルコードでは関数:initGuiの中でプロジェクトの投影を設定する。
プラグインはQGIS起動時にロードされるようにプラグインのチェックをONにする

[code]
def initGui(self):
途中省略
new_crs = QgsCoordinateReferenceSystem(‘EPSG:2451’)
QgsProject.instance().setCrs(new_crs)

[/code]

これで起動後に以下のメッセージが表示される

QGISのソースをチェックはしていないが、プラグインがQgsProjectを操作した後にQGISのappクラスでQgsProjectを操作しようとしてこのような動作になっていると思われる。

これを避けるためにはQGIS起動時に実行されるPythonスクリプトを用意してこのスクリプトで起動時に実行したいスクリプトを呼ぶと期待した動作となる。

ちなみに起動クリプトの内容は以下
[code]
from PyQt5.QtCore import QSettings
from PyQt5.QtWidgets import QDesktopWidget
from qgis.utils import iface
import qgis
qgis.utils.loadPlugin(‘プラグイン名’)
qgis.utils.startPlugin(‘プラグイン名’)
[/code]

GIS小ネタ

GeoTiff to 16 bit tiff, png or bmp image for heightmap

QDockWidgetのタイトルを消す

[code]
dockwidget = QDockWidget()
dockwidget.setTitleBarWidget(QWidget())
[/code]

消去前

消去後

Pythonの変数のスコープとWidget

ローカル変数に格納したWidgeのインスタンスはスコープを外れるとなくなる
これはQGISのプラグイン開発時にふと違和感を感じたPythonの仕様?

関数initGuiの中でQDockWidgetのインスタンスをローカル変数「mainpanel」にセットして
画面に追加すると正しく表示されない

しかしクラスのメンバー変数にセットすると正しく表示される

本来はaddDockWidgetした時点でインスタンスは他で保たれるであろうから表示されないことはない気がするが・・・

正しく表示されない例

[code]
def initGui(self):
mainpanel = MainPanelDockWidget()
self.iface.addDockWidget(Qt.RightDockWidgetArea, mainpanel)
self.dockwidget.show()
[/code]

正しく表示される例

[code]
def initGui(self):
self.dockwidget = MainPanelDockWidget()
self.iface.addDockWidget(Qt.RightDockWidgetArea, self.dockwidget)
self.dockwidget.show()
[/code]

QtデザイナでSplitterを配置

QDocWidget上にSplitterを配置

QWidgetを左右に配置

2つのQWidgetを選択して「ツールバー」の「水平にスプリッタの中に並べる」を選択

以上で2つのQWidgetがSplitterに配置される

Splitterが親のQDockWidget一杯に表示されるようにdockWidgetContentsを選択して「ツールバー」の「水平に並べる」ボタンをクリック

以上

QtデザイナでQDockWidgetをベースにレイアウトをデザインすると何も部品が置けない(2)

QDockWidgetにQWidgetが追加されないため、uiファイルを直接編集してQWidgetを追加。

編集前
[code]
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>DockWidget</class>
<widget class="QDockWidget" name="DockWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="allowedAreas">
<set>Qt::AllDockWidgetAreas</set>
</property>
<property name="windowTitle">
<string>DockWidget</string>
</property>
</widget>
<resources/>
<connections/>
</ui>
[/code]

編集後

[code]
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>DockWidget</class>
<widget class="QDockWidget" name="DockWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="allowedAreas">
<set>Qt::AllDockWidgetAreas</set>
</property>
<property name="windowTitle">
<string>DockWidget</string>
</property>

<widget class="QWidget" name="dockWidgetContents">
</widget>

</widget>
<resources/>
<connections/>
</ui>
[/code]

Qtデザイナで再度uiファイルを開くと正しくQWidgetが追加されている

QtデザイナでQDockWidgetをベースにレイアウトをデザインすると何も部品が置けない(1)

Qtデザイナを起動してメニュー「ファイル」-「ファイルを新規作成」を選択し以下に従ってデザイナ画面を起動

本来DockWidget配下にQWidgetが表示され、その上に部品を配置することができる。

しかしDockWidget配下にQWidgetがどうしても追加されない。

QGIS3+Eclipse+PyDevでデバッグ

環境

OS Windows10 64bit
QGIS QGIS3.4.4(OSGEO4W 32bit)
Eclipse 2018-12 64bit
Java Oracle JRE 10
PyDev 7.1.0.201902031515

QGISをインストール

OSGEO4W版のインストーラーを起動しC:\OSGEO4Wにインストール

QGISを起動

Eclipse

以下よりEclipseをダウンロード

https://www.eclipse.org/downloads/download.php?file=/oomph/epp/2018-12/R/eclipse-inst-win64.exe

ダウンロードしたeclipse-inst-win64を実行

起動すると以下のメッセージ表示

Eclipseのサイトより「Oracle JRE 10」をダウンロード

https://download.eclipse.org/oomph/jre/index-handler.php?vm=1_1_7_0_64_0&pn=Eclipse%20Installer&pu=http://wiki.eclipse.org/Eclipse_Installer&pi=http://download.eclipse.org/oomph/jre/128×128.png

ダウンロードした「jre-10.0.2_windows-x64_bin」を実行

インストールボタンをクリック

再度「eclipse-inst-win64」を実行

eclipse インストーラーが起動されたら「eclipse IDE for java developers」を選択

証明書の確認

PyDev

Eclipseを起動してHelpメニューの「Install New Software」

「Work With」の「Add」ボタンをクリック

NameにPyDev、Locationに「http://pydev.org/updates」を指定しAddボタンをクリック

PyDevをチェックしてNEXTボタンをクリック

Detaileボタンを押してPydevのインストール先を確認してから「Install Anyway」を実行

PyDevの設定

Eclipseを起動して「Window」→「Preferences」を選択

左のTreeでPyDev-Interpreters-Python Interpreterを選択

QGISが使用するPython.exeを指定するためにQGISを起動してPYTHONHOMEの値を確認

「Browse for pythonpypy exe」ボタンを押してNAMEには任意の名称(ここではpython37)、値には先ほど調べたPython.exeのフルパスを指定。

Librariesは自動でいくつかの参照先が指定されるが手動で不足分を指定

先ほどインストール先を確認したPyDevも指定

Packagesには警告らしき表示があるが無視

Forced Builtinsのタブを表示して「New」ボタンを押してqgisとPyQt5をそれぞれ登録

Environmentoタブを表示して以下の環境変数を設定

「Apply」ボタンを押して「Apply and Close」ボタンを押して設定を反映

設定内容が即反映されないので「Apply」ボタンを押したら暫く待つこと。

※設定が終了する前に画面を閉じると正しく設定が終了しない

デバッグの準備

外部TOOLにQGISを設定

メニュ「Run」-「External Tools Configurations」を指定して外部TOOLとしてQGISを設定

プロジェクトを作成

Eclipseの「New」メニューから-「Project」-「PyDev Project」を選択

以下に従ってプロジェクトの内容を設定しFinishボタンを押す

確認のためにQGISのPlugin Builder3でプラグインを作成して「C:\Users\ユーザー名\AppData\Roaming\QGIS\QGIS3\profiles\default\python\plugins\」に配置

init.pyに以下を記述

[code]
import os,sys
sys.path.append("C:\\Users\\kernel\\.p2\\pool\\plugins\\org.python.pydev.core_7.1.0.201902031515\\pysrc")
import pydevd
pydevd.settrace()
[/code]

sys.pathに追加しているのはPyDev

この記述はEclipseを使用しないときはエラーとなる

これを記述するとclassFactory関数でブレークする

デバッグ実行

ここからの操作は若干確信がないが、とりあえず正しく動作したので良しとして説明

プラグイン「Remote Debug」と「Plugin Reloader」を有効にするためにプラグインの設定で実験的プラグインも表示する

デバッグボタンを押す

「start pydev Server」ボタンをクリック

「外部TOOL QGISを起動」

iOS アプリをAdHocでインストール

Xcodeのバージョンが10.1になったのであらためてiOSアプリの作成からAdHocでインストールするまでをおさらい!

最初にXcodeでSingle View Appを作成

最近はXcodeが勝手に証明書関連を設定してくれるが、なぜかうまくいかなかったので手動で設定する

Apple DeveloperにログインしてProductionの証明書を確認

証明書はXcodeのPreferencesをクリックしてして表示される画面の左下+ボタンで作成可能

App IDを作成

DeviceにAdHocでインストールしてするデバイスを追加

AdHocで使用するProvisioning Profilesを作成

以上でçの作成は終了

XcodeのPreferencesからAppleIDの画面を表示して「Download Manual Profiles」ボタンを押してAdHoc用のProvisioning Profilesをダウンロード(していると思う・・・)

xcodeを開いてSigningのチェックを外しProvisioning Profilesに作成したAdHocを指定する

これからAdHoc用のコンパイルを開始するが、その前にProductメニューのDestinationをGeneric iOS Deviceに設定。この設定をしないとProductメニューのArciveが有効にならない。

ProductメニューのArciveを実行

「Distribute App」ボタンをクリック

AdHocを選択

optionを指定

証明書とProvisioning Profilesを指定

Exportボタンを押してipaファイルの出力先を指定。

iPhoneにインストール

iTunesを起動してiPhoneを接続

iPaをiTunesの左パネルの自分のデバイス上にドラッグしてインストール

ちなみにiTunes 12.7.3.64では正しくインストールできたが、12.8.2.3ではドラッグできなかった?