rideEndFloor_C_1 大きなアクタはプレシャドウを受け取り、bCastDynamicShadow が false に設定されていない限り、パフォーマンスに極度の低下が生じます。
[UE5.3.2] LANDSCAPE: 1 ACTOR WITH PHYSICAL MATERIALS NEEDS TO BE REBUILTの解決
https://forums.unrealengine.com/t/ue5-landscape-physical-material-needs-to-be-rebuilt/484614
みなさん、こんにちは。私も同じ問題に遭遇しました。Build>Build All Landscape に移動すると、「物理マテリアルを再構築する必要があります」というエラーを解決できることが分かりました。
[Landscape] ワールド構築がうまくいくことを祈っています。
解決しませんでした。
Landscapeを消しました。エラーは出ない
LandScapeをつくりなおしました。エラーが出る。
[UE5][UQ]アンリアルクエストのセーブゲームが存在するのに存在しないって言われるのなんでしたっけ? ちなみにプロジェクト内でゲームモードをUQのBP_GameModeにすれば動くが新たに作ったゲームモードだと動かない。解答
解答
SaveName変数のデフォルト値「RankingData」が入ってるか?
SaveNameのデフォルト値が Get SaveNameで使われてるか?
リファレンスの検索で最後に出てくる
WBP_Rankingで Cast して自分のゲームモードを読んでるか?
できた
スラスラわかるC++で、実行するとエラー4_5 g++ -o list4_5.exe list4_5.cpp でコンパイルすると undefined reference to `getBmi(double, double)’ collect2.exe: error: ld returned 1 exit status
スラスラC++で、実行するとエラー
C:\samples\chapter04\4_5>cd C:\samples\chapter04\4_5\
C:\samples\chapter04\4_5>g++ -o list4_5.exe list4_5.cpp
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe:
C:\Users\furcr\AppData\Local\Temp\ccs3yFYU.o:list4_5.cpp:(.text+0x72):
undefined reference to `getBmi(double, double)' collect2.exe: error:
ld returned 1 exit status
解決方法
chapter4.h
// BMIを求める関数のプロトタイプ宣言
double getBmi(double height, double weight);
getBmi.cpp
double getBmi(double height, double weight) {
double bmi; // BMIの計算結果を入れる
// cm単位をm単位にする
height /= 100;
// BMIを計算する
bmi = weight / height / height;
// 戻り値としてBMIを返す
return bmi;
}
list4_5.cpp
#include <iostream>
using namespace std;
#include "chapter4.h"
int main() {
double height; // 身長
double weight; // 体重
double bmi; // BMI
// キー入力をheightに格納する
cout << "身長(cm)を入力してください:";
cin >> height;
// キー入力をweightに格納する
cout << "体重(kg)を入力してください:";
cin >> weight;
// 身長と体重からBMIを計算する
bmi = getBmi(height, weight);
// BMIを画面に表示する
cout << "あなたのBMIは、" << bmi << "です。" << endl;
return 0;
}
cd_samples4_5_header.cmd
C:\samples\chapter04\4_5>cd C:\samples\chapter04\4_5\
C:\samples\chapter04\4_5>g++ list4_5.cpp getBmi.cpp -o list4_5.exe
C:\samples\chapter04\4_5>list4_5.exe
身長(cm)を入力してください:167
体重(kg)を入力してください:75
あなたのBMIは、26.8923です。
C:\samples\chapter04\4_5>cmd /k
C:\samples\chapter04\4_5>
- 関数の定義を確認:
chapter4.h
ファイル内でgetBmi(double height, double weight)
関数の実装が正しく行われていることを確認してください。chapter4.h
には関数のプロトタイプ宣言が含まれているはずですが、実際の関数の定義が別のファイル(おそらくchapter4.cpp
など)にあるはずです。
- コンパイル時に関連するファイルを指定:
- コンパイル時に
list4_5.cpp
と関連するファイルを一緒に指定する必要があります。例えば、次のようにコンパイルしてみてください。
g++ list4_5.cpp getBmi.cpp -o list4_5.exe
chapter4.cpp
のファイル名は実際のファイル名に合わせて修正してください。
- コンパイル時に
- 再コンパイルと実行:
- 上記の修正を行ったら、再度コンパイルして実行してみてください。
maya python 検索用の 正規表現 を作成したテキストフィールドから入力するには?
maya python How can I enter a regular expression for search from the created text field?
import maya.cmds as cmds
import re
def search_objects_by_regex(*args):
# テキストフィールドから正規表現を取得
regex_pattern = cmds.textField("regexField", query=True, text=True)
# シーン内のすべてのオブジェクトを取得
all_objects = cmds.ls()
# 正規表現パターンをコンパイル
try:
regex = re.compile(regex_pattern)
except re.error as e:
cmds.warning(f"Invalid regex pattern: {e}")
return
# 正規表現に一致するオブジェクトをフィルタリング
matching_objects = [obj for obj in all_objects if regex.search(obj)]
# 結果を表示
if matching_objects:
cmds.confirmDialog(title='Search Results', message='\n'.join(matching_objects))
else:
cmds.confirmDialog(title='Search Results', message='No matching objects found.')
# UIの作成
if cmds.window("regexSearchWindow", exists=True):
cmds.deleteUI("regexSearchWindow")
cmds.window("regexSearchWindow", title="Regex Search", widthHeight=(300, 100))
cmds.columnLayout(adjustableColumn=True)
cmds.text(label="Enter Regex Pattern:")
cmds.textField("regexField")
cmds.button(label="Search", command=search_objects_by_regex)
cmds.showWindow("regexSearchWindow")
検索置換の場合
import maya.cmds as cmds
import re
def replace_objects_by_regex(*args):
# テキストフィールドから正規表現と置換文字列を取得
regex_pattern = cmds.textField("regexField", query=True, text=True)
replace_text = cmds.textField("replaceField", query=True, text=True)
# シーン内のすべてのオブジェクトを取得
all_objects = cmds.ls()
# 正規表現パターンをコンパイル
try:
regex = re.compile(regex_pattern)
except re.error as e:
cmds.warning(f"Invalid regex pattern: {e}")
return
# 正規表現に一致するオブジェクトを置換
replaced_objects = [regex.sub(replace_text, obj) for obj in all_objects]
# 結果を表示
if replaced_objects:
cmds.confirmDialog(title='Replace Results', message='\n'.join(replaced_objects))
else:
cmds.confirmDialog(title='Replace Results', message='No objects replaced.')
# UIの作成
if cmds.window("regexReplaceWindow", exists=True):
cmds.deleteUI("regexReplaceWindow")
cmds.window("regexReplaceWindow", title="Regex Replace", widthHeight=(300, 150))
cmds.columnLayout(adjustableColumn=True)
cmds.text(label="Enter Regex Pattern:")
cmds.textField("regexField")
cmds.text(label="Enter Replace Text:")
cmds.textField("replaceField")
cmds.button(label="Replace", command=replace_objects_by_regex)
cmds.showWindow("regexReplaceWindow")
[ue5] python rename 依存関係のあるファイルをチェックアウトしてからリネームする下調べ
rename_asset(asset, newName) 色々あるが基本はこれでいい。むしろこれしか動かず。
editor_util = unreal.EditorUtilityLibrary()
# 新しい名前
newName = newName
# リネームしたいアセット
asset = unreal.load_asset(package_name)
# rename実行
editor_util.rename_asset(asset, newName)
複数ファイルに対応する。
def rename_endZ_remove_loop(self):
editorAssetLib = unreal.EditorAssetLibrary()
editor_util = unreal.EditorUtilityLibrary()
#editorStaticMeshLib = unreal.EditorStaticMeshLibrary()
MaterialEditingLibrary = unreal.MaterialEditingLibrary()
asset_registry = unreal.AssetRegistryHelpers.get_asset_registry()
#import unreal.AssetRegistry
#AssetRegistry=unreal.AssetRegistry()
EnvName=unreal.Name.cast("/Game/Effects")
#EnvName=unreal.Name.cast(readDirPath)
EnvArr=unreal.AssetRegistry.get_assets_by_path(asset_registry,EnvName,True,False)
#EnvArr = asset_registry.get_assets()
#EnvArr =self.SelectedAssets
unreal.log_warning("main_way_start2 040 unreal.AssetRegistry.get_assets_by_path(asset_registry,EnvName,True,False)")
unreal.log_warning("main_way_start2 041 get_assets_by_path() EnvArr len= "+str(len(EnvArr)))
NGlist=[]
checkout_Arr=[]
checkout_Arr_Str=""
rename_data_Arr=[]
total_frames = len(EnvArr)
text_label = "Rename Execution!"
with unreal.ScopedSlowTask(total_frames, text_label) as slow_task:
slow_task.make_dialog(True) # まだダイアログが表示されていない場合は表示します
for i in range(total_frames):
if slow_task.should_cancel():# ユーザーが UI の [Cancel] を押した場合は True
break
slow_task.enter_progress_frame(1)# 1 フレーム次に進めます。
AssetData=EnvArr[i]
print("AssetData= "+str(AssetData))
package_name=str(AssetData.package_name)
print("package_name= "+str(package_name))
package_name_Arr=package_name.split("/")
package_name_Arr_len=len(package_name_Arr)
print("package_name_Arr_len= "+str(package_name_Arr_len))
assetName=package_name_Arr[package_name_Arr_len-1]
print("assetName= "+str(assetName))
assetNameStr=str(assetName)+"."
# 新しい名前
newName=assetNameStr.replace("Z.","")
# リネームしたいアセット
asset = unreal.load_asset(package_name)
# 新しいパッケージパス
new_package_path = package_name+"."
new_package_path=new_package_path.replace("Z.","")
editor_util.rename_asset(asset, newName)
# リネームデータを作成
#rename_data = unreal.AssetRenameData(asset, new_package_path, new_name)
#unreal.EditorUtilityLibrary.rename_asset(rename_data)
#rename_data_Arr.append(rename_data)
#rename_assets(rename_data_Arr)
依存関係のあるファイルをチェックアウトしてからリネーム
# -*- coding: utf-8 -*-
import unreal
import sys
import os
import re
import codecs
import os
import datetime
unreal.log("--------------py--start000-----------------")
unreal.log(" ")
class RefferenceCounter():
def mainWay(self):
self.AssetRegistryLoaded=False
#----------------------------------------------------------
self.tickhandle = None
self.tickhandle = unreal.register_slate_pre_tick_callback(self.testRegistry)
print("tickhandle="+str(self.tickhandle))
def testRegistry(self,deltaTime):
unreal.log_warning("ticking...mainWay")
asset_registry = unreal.AssetRegistryHelpers.get_asset_registry()
if asset_registry.is_loading_assets():
unreal.log_warning("still loading...mainWay")
else:
unreal.log_warning("ready!.....mainWay")
if(self.AssetRegistryLoaded==False):
self.AssetRegistryLoaded=True
self.textLoad2()
#self.textLoad()
unreal.unregister_slate_pre_tick_callback(self.tickhandle)
unreal.unregister_slate_pre_tick_callback(self.tickhandle)
def getProject_SavedDir(self):
project_saved_dir=unreal.Paths.project_saved_dir()
print("project_saved_dir= "+project_saved_dir)
HD_project_saved_dir=os.path.abspath(project_saved_dir)
print("HD_project_saved_dir= "+HD_project_saved_dir)
HD_project_saved_dir_slash=HD_project_saved_dir.replace('\\', '/')
print("HD_project_saved_dir_slash= "+HD_project_saved_dir_slash)
return HD_project_saved_dir_slash
def get_project_dir(self):
project_dir=unreal.Paths.project_dir()
print("project_dir= "+project_dir)
HD_project_dir=os.path.abspath(project_dir)
print("HD_project_dir= "+HD_project_dir)
HD_project_dir_slash=HD_project_dir.replace('\\', '/')
print("HD_project_dir_slash= "+HD_project_dir_slash)
return HD_project_dir_slash
def textLoad2(self):
import codecs
readPath=self.getProject_SavedDir()+'/RefferenceCounter/SelectedAsset.txt'
print("readPath= "+readPath)
fin = codecs.open(readPath, 'r', 'utf_8')
SelectedAssetArr=[]
for line in fin:
line=line.replace(" ","")#Space
line=line.replace(" ","")#TAB
line=line.replace("\r","")
line=line.replace("\n","")
if(line==""):
pass
else:
SelectedAssetArr.append(line)
#txtData=fin.read()
print("SelectedAssetArr= "+str(SelectedAssetArr))
#rejectLines=txtData
#print("SelectedAssets= "+SelectedAssets)
self.SelectedAssets=SelectedAssetArr
self.main_way_start2()
def main_way_start2(self):
editorAssetLib = unreal.EditorAssetLibrary()
editor_util = unreal.EditorUtilityLibrary()
#editorStaticMeshLib = unreal.EditorStaticMeshLibrary()
MaterialEditingLibrary = unreal.MaterialEditingLibrary()
asset_registry = unreal.AssetRegistryHelpers.get_asset_registry()
#import unreal.AssetRegistry
#AssetRegistry=unreal.AssetRegistry()
EnvName=unreal.Name.cast("/Game/Materials")
EnvName_Str=editor_util.get_current_content_browser_path()
EnvName=unreal.Name.cast(EnvName_Str)
#EnvName=unreal.Name.cast(readDirPath)
EnvArr=unreal.AssetRegistry.get_assets_by_path(asset_registry,EnvName,True,False)
unreal.log_warning("main_way_start2 040 unreal.AssetRegistry.get_assets_by_path(asset_registry,EnvName,True,False)")
unreal.log_warning("main_way_start2 041 get_assets_by_path() EnvArr len= "+str(len(EnvArr)))
NGlist=[]
checkout_Arr=[]
checkout_Arr_Str=""
total_frames = len(EnvArr)
text_label = "reference And Dependency Checking!"
with unreal.ScopedSlowTask(total_frames, text_label) as slow_task:
slow_task.make_dialog(True) # まだダイアログが表示されていない場合は表示します
for i in range(total_frames):
if slow_task.should_cancel():# ユーザーが UI の [Cancel] を押した場合は True
break
slow_task.enter_progress_frame(1)# 1 フレーム次に進めます。
#package_name=EnvArr[i]
AssetData=EnvArr[i]
print("AssetData= "+str(AssetData))
package_name=str(AssetData.package_name)
print("package_name= "+str(package_name))
package_name_Arr=package_name.split("/")
package_name_Arr_len=len(package_name_Arr)
print("package_name_Arr_len= "+str(package_name_Arr_len))
assetName=package_name_Arr[package_name_Arr_len-1]
print("assetName= "+str(assetName))
dependency_options=unreal.AssetRegistryDependencyOptions(include_soft_package_references=True, include_hard_package_references=True, include_searchable_names=False, include_soft_management_references=False, include_hard_management_references=False)
#
asset_registry = unreal.AssetRegistryHelpers.get_asset_registry()
dependencies=unreal.AssetRegistry.get_dependencies(asset_registry,package_name, dependency_options)
referencers=unreal.AssetRegistry.get_referencers(asset_registry,package_name, dependency_options)
dependencies_len=len(dependencies)
referencers_len=len(referencers)
print("----------------referencers_len= "+str(referencers_len)+"-------------------")
dependencies_str=self.array_to_str(dependencies)
referencers_str=self.array_to_str(referencers)
all_ref_dependencys_str=dependencies_str+"|"+referencers_str
all_ref_dependencys_len=referencers_len+dependencies_len
#A=assetName+","+assetPath
A=assetName+","+str(referencers_len)+","+referencers_str+","+str(dependencies_len)+","+dependencies_str+","
A=A+str(all_ref_dependencys_len)+","+all_ref_dependencys_str
checkout_Arr_Str=checkout_Arr_Str+all_ref_dependencys_str+"|"+package_name+"|"
#A=A+","+str(package_name)
#for dep in dependencies:
# A=A+","+str(dep)
NGlist.append(A)
unreal.log_warning(A)
# チェックアウト
checkout_Arr=checkout_Arr_Str.split("|")
for checkout_file_path in checkout_Arr:
if checkout_file_path=="":
pass
else:
unreal.EditorAssetLibrary.checkout_asset(checkout_file_path)
self.rename_endZ_remove_loop(EnvName_Str)
def rename_endZ_remove_loop(self,EnvName_Str):
editorAssetLib = unreal.EditorAssetLibrary()
editor_util = unreal.EditorUtilityLibrary()
#editorStaticMeshLib = unreal.EditorStaticMeshLibrary()
MaterialEditingLibrary = unreal.MaterialEditingLibrary()
asset_registry = unreal.AssetRegistryHelpers.get_asset_registry()
#import unreal.AssetRegistry
#AssetRegistry=unreal.AssetRegistry()
EnvName=unreal.Name.cast(EnvName_Str)
#EnvName=unreal.Name.cast(readDirPath)
EnvArr=unreal.AssetRegistry.get_assets_by_path(asset_registry,EnvName,True,False)
#EnvArr = asset_registry.get_assets()
#EnvArr =self.SelectedAssets
unreal.log_warning("main_way_start2 040 unreal.AssetRegistry.get_assets_by_path(asset_registry,EnvName,True,False)")
unreal.log_warning("main_way_start2 041 get_assets_by_path() EnvArr len= "+str(len(EnvArr)))
NGlist=[]
checkout_Arr=[]
checkout_Arr_Str=""
rename_data_Arr=[]
total_frames = len(EnvArr)
text_label = "Rename Execution!"
with unreal.ScopedSlowTask(total_frames, text_label) as slow_task:
slow_task.make_dialog(True) # まだダイアログが表示されていない場合は表示します
for i in range(total_frames):
if slow_task.should_cancel():# ユーザーが UI の [Cancel] を押した場合は True
break
slow_task.enter_progress_frame(1)# 1 フレーム次に進めます。
AssetData=EnvArr[i]
print("AssetData= "+str(AssetData))
package_name=str(AssetData.package_name)
print("package_name= "+str(package_name))
package_name_Arr=package_name.split("/")
package_name_Arr_len=len(package_name_Arr)
print("package_name_Arr_len= "+str(package_name_Arr_len))
assetName=package_name_Arr[package_name_Arr_len-1]
print("assetName= "+str(assetName))
assetNameStr=str(assetName)+"."
# 新しい名前
newName=assetNameStr.replace("Z.","")
# リネームしたいアセット
asset = unreal.load_asset(package_name)
# 新しいパッケージパス
new_package_path = package_name+"."
new_package_path=new_package_path.replace("Z.","")
editor_util.rename_asset(asset, newName)
# リネームデータを作成
#rename_data = unreal.AssetRenameData(asset, new_package_path, new_name)
#unreal.EditorUtilityLibrary.rename_asset(rename_data)
#rename_data_Arr.append(rename_data)
#rename_assets(rename_data_Arr)
Class_Ins=RefferenceCounter()
Class_Ins.mainWay()
CGWORLD.JPさんから引用、「リネームとリダイレクタはある意味密接な関係にある…
KAEditorUtilityBlueprintLibrary.h
#pragma once
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "KAEditorUtilityBlueprintLibrary.generated.h"
UCLASS()
class KAEDITORUTILITYTEST_API UKAEditorUtilityBlueprintLibrary : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
//RedirectorをFixUpする
UFUNCTION(BlueprintCallable, Category = "KAEditorUtility")
static void FixupRedirectors(const TArray<FAssetData>& Assets, bool bCheckoutDialogPrompt);
};
KAEditorUtilityBlueprintLibrary.cpp
#include "KAEditorUtilityBlueprintLibrary.h"
#include "AssetToolsModule.h"
void UKAEditorUtilityBlueprintLibrary::FixupRedirectors(const TArray<FAssetData>& Assets, bool bCheckoutDialogPrompt)
{
FAssetToolsModule& AssetToolsModule = FModuleManager::GetModuleChecked<FAssetToolsModule>(TEXT("AssetTools"));
//Redirectorの取得
TArray<UObjectRedirector*> Redirectors;
for (FAssetData Object : Assets)
{
if (UObjectRedirector* Redirector = Cast<UObjectRedirector>(Object.GetAsset()))
{
Redirectors.Emplace(Redirector);
}
}
if (Redirectors.Num() > 0)
{
AssetToolsModule.Get().FixupReferencers(Redirectors, bCheckoutDialogPrompt);
return true;
}
return false;
}
参考URL
https://cgworld.jp/regular/202312-ue5tool-01.html
https://docs.unrealengine.com/5.0/en-US/PythonAPI/class/EditorAssetLibrary.html
[UE5.3.2][Niagara]Niagara Parameter Collection の使い方
確認用のシステム、エミッター、モジュール、そしてNiagaraParameterCollectionのアセットを作ります。
名前は何でもいいので NiagaraParameterCollection 開いて、新しいパラメータfloatを一つ作ります。
最初のNiagaraParameterCollection設定は、これだけでOKです。
モジュール側の設定はこれで終了です。
次はエミッター側の設定です
ParticleSpawnに、先ほど作ったモジュールを追加します(自分でつけた名前で検索してください)
追加したモジュールに、MyFloat(設定した名前です)という部分に、数値が入るようになっていれば大丈夫です。
ここに入れた数字が、Lifetime(パーティクルの寿命)に設定されます。
設定しておくと、解りやすいと思います。
次に、NiagaraParameterCollectionを実際に入れていきます
まず、Parameterというウインドウを出します
ここから、追加したNiagaraParameterCollectionを登録します。
追加したら、この情報を、ドラッグして差し替えます。
このように登録されていればOKです。
ここまですれば、設定したNiagaraParameterCollectionファイルの数値を動かすと、このエミッターの寿命が延びたり縮んだりしていると思います。
実際に組み込んだ様子がこちら。
調整として使いやすいポイントとして、エミッター毎固定ではなく、システム毎に適用するデータを差し替える事が出来る点です。
エミッター自体の情報を差し替える必要がなく、システム側で変えることができるので、別のシステムで使うようのエミッターを流用していく事も可能です。
エミッター自体にNiagaraParameterCollectionデータを入れている場合でも、システム側でほかのデータに差し替える等も可能です。
HoudiniのHDAのような、いくつかのパラメータを変えるだけで簡単に調整出来る仕様というのも、段々出来ていくのかなと思います。
ということでした
参考URL
[UE5/3.2] PoseAssetの設定保存方法
UE5 PoseAssetの保存方法
ボーンの角度を編集したら。
PoseNameのところでAddPose >AddPoseFrom Currentで
PoseNameに名前を付けて元のポーズは削除する。
Valueを1にすると作ったポーズが見ることができる。
[maya][SkinWeight]スキンウェイトの部分コピー
Partial copy of skin weights
MAYAでのウェイト作業でしたら、部分コピーできます。
1,コピー元とコピー先のオブジェクトを選択
2,F9で頂点選択モード
3,コピー元ウェイト範囲を頂点選択
4,コピー先のウェイト範囲を頂点選択
5,スキンウェイトのコピー
の手順でスキンウェイトの部分コピーできます。
んーできない。
できないとおもっていたら。
んーできない。結局ベースはコピーしてそこからスキンウェイトペイントした。
[maya2022][Pyside2][python3]widget_galleryを動くように変更
# -*- coding: utf-8 -*-
import os
from functools import partial
import time
import imp
"""
PySide2モジュールを探し、ある場合はそちらをインポートします。
"""
try:
imp.find_module('PySide2')
from PySide2.QtWidgets import *
from PySide2.QtGui import *
from PySide2.QtCore import *
except ImportError:
from PySide.QtGui import *
from PySide.QtCore import *
LOGO_IMAGE = r"画像のパスをここに入れてください。"
def get_maya_pointer():
"""
Mayaのメインウィンドウを取得する関数
"""
try:
import maya.cmds as cmds
from maya import OpenMayaUI
except ImportError:
return None
"""
実は2017ではshibokenも2になっているので、あればshiboken2をインポートします。
"""
try:
imp.find_module("shiboken2")
import shiboken2
return shiboken2.wrapInstance(int(OpenMayaUI.MQtUtil.mainWindow()), QWidget)
except ImportError:
import shiboken
return shiboken.wrapInstance(int(OpenMayaUI.MQtUtil.mainWindow()), QWidget)
class MyDialog(QDialog):
def __init__(self, parent = None, f = 0):
super(MyDialog, self).__init__(parent, f)
#-----------------------------------------------------------------------
# Layout
#-----------------------------------------------------------------------
mainLayout = QVBoxLayout()
self.setLayout(mainLayout)
#-----------------------------------------------------------------------
# Image
#-----------------------------------------------------------------------
imageWidget = QLabel()
imageWidget.setPixmap(QPixmap(LOGO_IMAGE))
mainLayout.addWidget(imageWidget)
#-----------------------------------------------------------------------
# Description
#-----------------------------------------------------------------------
description = QLabel("This is coustom dialog.")
mainLayout.addWidget(description)
#-----------------------------------------------------------------------
# Text input
#-----------------------------------------------------------------------
self._inputWidget = QLineEdit()
mainLayout.addWidget(self._inputWidget)
#-----------------------------------------------------------------------
# Buttons
#-----------------------------------------------------------------------
buttonArea = QHBoxLayout()
mainLayout.addLayout(buttonArea)
buttonArea.addStretch()
okBtn = QPushButton("OK")
buttonArea.addWidget(okBtn)
okBtn.clicked.connect(self.accept)
cancelBtn = QPushButton("Cancel")
buttonArea.addWidget(cancelBtn)
cancelBtn.clicked.connect(self.reject)
def getInputText(self):
return self._inputWidget.text()
class DF_TalkUI(QMainWindow):
def __init__(self, parent = None):
super(DF_TalkUI, self).__init__(parent)
self.setObjectName("DF_Talk_Window")
self.setWindowTitle("DF Talk Window")
#self._initUI()
self.errorDialog = QErrorMessage(self) # QErrorMessageインスタンスの保持
def myInit(self,qApp):
self.qApp=qApp
wrapper = QWidget()
self.setCentralWidget(wrapper)
mainLayout = QVBoxLayout()
wrapper.setLayout(mainLayout)
#-----------------------------------------------------------------------
# First row
#-----------------------------------------------------------------------
firstHolizontalArea = QHBoxLayout()
firstHolizontalArea.setSpacing(20)
mainLayout.addLayout(firstHolizontalArea)
labelArea = QVBoxLayout()
firstHolizontalArea.addLayout(labelArea)
labelWidget = QLabel("Text is shown like this.")
labelArea.addWidget(labelWidget)
imageWidget = QLabel()
imageWidget.setPixmap(QPixmap(LOGO_IMAGE))
labelArea.addWidget(imageWidget)
labelArea.addStretch()
textArea = QTextEdit()
textArea.setPlainText("Text are\ncan be set\nmultiple lines and HTML.")
firstHolizontalArea.addWidget(textArea)
mainLayout.addWidget(self._makeHorizontalLine())
#-----------------------------------------------------------------------
# Second row
#-----------------------------------------------------------------------
secondHolizontalArea = QHBoxLayout()
secondHolizontalArea.setSpacing(20)
mainLayout.addLayout(secondHolizontalArea)
lineEdit = QLineEdit()
lineEdit.setMaximumWidth(200)
lineEdit.setText("This widget is useful for inputting text")
secondHolizontalArea.addWidget(lineEdit)
comboBox = QComboBox()
comboBox.addItems(["This", "is", "combobox", "it's", "useful"])
comboBox.setEditable(True)
comboBox.setInsertPolicy(QComboBox.NoInsert)
comboBox.completer().setCompletionMode(QCompleter.PopupCompletion)
secondHolizontalArea.addWidget(comboBox)
spinBox = QSpinBox()
spinBox.setMinimum(0)
spinBox.setMaximum(10)
spinBox.setSuffix("min")
secondHolizontalArea.addWidget(spinBox)
mainLayout.addWidget(self._makeHorizontalLine())
#-----------------------------------------------------------------------
# Third row
#-----------------------------------------------------------------------
thirdHorizontalArea = QHBoxLayout()
thirdHorizontalArea.setSpacing(20)
mainLayout.addLayout(thirdHorizontalArea)
checkBox = QCheckBox("Check box")
thirdHorizontalArea.addWidget(checkBox)
checkBox.setChecked(True)
radioArea = QVBoxLayout()
thirdHorizontalArea.addLayout(radioArea)
radioGroup = QButtonGroup(self)
radioBtn1 = QRadioButton("Option 1")
radioArea.addWidget(radioBtn1)
radioGroup.addButton(radioBtn1)
radioBtn2 = QRadioButton("Option 2")
radioArea.addWidget(radioBtn2)
radioGroup.addButton(radioBtn2)
radioBtn3 = QRadioButton("Option 3")
radioArea.addWidget(radioBtn3)
radioGroup.addButton(radioBtn3)
radioBtn1.setChecked(True)
mainLayout.addWidget(self._makeHorizontalLine())
#-----------------------------------------------------------------------
# Fourth row
#-----------------------------------------------------------------------
fourthHorizontalArea = QHBoxLayout()
fourthHorizontalArea.setSpacing(20)
mainLayout.addLayout(fourthHorizontalArea)
calender = QCalendarWidget()
fourthHorizontalArea.addWidget(calender)
calender.setMaximumWidth(300)
lcdNumber = QLCDNumber()
fourthHorizontalArea.addWidget(lcdNumber)
lcdNumber.display(1234)
sliderArea = QVBoxLayout()
fourthHorizontalArea.addLayout(sliderArea)
sliderDisplay = QLabel("0")
sliderArea.addWidget(sliderDisplay)
slider = QSlider(Qt.Horizontal)
sliderArea.addWidget(slider)
slider.setRange(0, 100)
slider.setTickPosition(QSlider.TicksBothSides)
slider.setSingleStep(5)
slider.setPageStep(10)
slider.setTickInterval(10)
slider.valueChanged.connect(lambda val: sliderDisplay.setText(str(val)))
slider.setValue(0)
dialDisplay = QLabel("0")
sliderArea.addWidget(dialDisplay)
dial = QDial()
sliderArea.addWidget(dial)
dial.setRange(0, 100)
dial.setSingleStep(5)
dial.setPageStep(10)
dial.setNotchesVisible(True)
dial.setWrapping(True)
dial.setNotchTarget(5)
dial.valueChanged.connect(lambda val: dialDisplay.setText(str(val)))
dial.setValue(0)
mainLayout.addWidget(self._makeHorizontalLine())
#-----------------------------------------------------------------------
# fifth row
#-----------------------------------------------------------------------
fifthHorizontalArea = QHBoxLayout()
fifthHorizontalArea.setSpacing(20)
mainLayout.addLayout(fifthHorizontalArea)
fifthHorizontalArea.addWidget(self._makeListWidget())
fifthHorizontalArea.addWidget(self._makeTableWidget())
fifthHorizontalArea.addWidget(self._makeTreeWidget())
mainLayout.addWidget(self._makeHorizontalLine())
#-----------------------------------------------------------------------
# sixth row
#-----------------------------------------------------------------------
sixthHorizontalArea = QHBoxLayout()
sixthHorizontalArea.setSpacing(20)
mainLayout.addLayout(sixthHorizontalArea)
msgBoxBtn = QPushButton("Message Dialog")
sixthHorizontalArea.addWidget(msgBoxBtn)
msgBoxBtn.clicked.connect(partial(QMessageBox().information, self, "Message", "This is normal information message."))
colorDialogBtn = QPushButton("Color Dialog")
sixthHorizontalArea.addWidget(colorDialogBtn)
colorDialogBtn.clicked.connect(self._showColorDialog)
progressDialogBtn = QPushButton("Progress Dialog")
sixthHorizontalArea.addWidget(progressDialogBtn)
progressDialogBtn.clicked.connect(self._showProgressDialog)
fileDialogBtn = QPushButton("File Dialog")
sixthHorizontalArea.addWidget(fileDialogBtn)
fileDialogBtn.clicked.connect(partial(QFileDialog.getOpenFileName, self, "File Select", options = QFileDialog.DontUseNativeDialog))
#-----------------------------------------------------------------------
# seventh row
#-----------------------------------------------------------------------
seventhHorizontalArea = QHBoxLayout()
seventhHorizontalArea.setSpacing(20)
mainLayout.addLayout(seventhHorizontalArea)
errorMsgBtn = QPushButton("Error Dialog")
seventhHorizontalArea.addWidget(errorMsgBtn)
errorMsgBtn.clicked.connect(self._showErrorDialog)
inputDialogTextBtn = QPushButton("Input (text)")
seventhHorizontalArea.addWidget(inputDialogTextBtn)
inputDialogTextBtn.clicked.connect(self._showInputTextDialog)
inputDialogComboBtn = QPushButton("Input (combo)")
seventhHorizontalArea.addWidget(inputDialogComboBtn)
inputDialogComboBtn.clicked.connect(self._showInputComboDialog)
dialogBtn = QPushButton("Custom Dialog")
seventhHorizontalArea.addWidget(dialogBtn)
dialogBtn.clicked.connect(self._showCustomDialog)
#-----------------------------------------------------------------------
# dock widget
#-----------------------------------------------------------------------
dockWidget = QDockWidget("Dock Window", self)
dockWrapper = QWidget()
dockWidget.setWidget(dockWrapper)
dockWidget.setAllowedAreas(Qt.RightDockWidgetArea | Qt.BottomDockWidgetArea)
dockLayout = QVBoxLayout()
dockWrapper.setLayout(dockLayout)
dockDescription = QLabel("This is dock widget contents.")
dockLayout.addWidget(dockDescription)
dockButton = QPushButton("OK")
dockLayout.addWidget(dockButton)
self.addDockWidget(Qt.BottomDockWidgetArea, dockWidget)
def _makeHorizontalLine(self):
hline = QFrame()
hline.setFrameShape(QFrame.HLine)
hline.setFrameShadow(QFrame.Sunken)
return hline
def _makeListWidget(self):
"""
QListWidgetを作成する関数
"""
listWidget = QListWidget()
listWidget.setMaximumWidth(100)
listWidget.addItems(["this", "is", "list", "widget"])
return listWidget
def _makeTableWidget(self):
"""
QTableWidgetを作成する関数
"""
tableWidget = QTableWidget()
headerLabels = ["Name", "Age", "Sex"]
tableWidget.setColumnCount(len(headerLabels))
tableWidget.setHorizontalHeaderLabels(headerLabels)
tableWidget.verticalHeader().setVisible(False)
try:
tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Interactive)
except:
tableWidget.horizontalHeader().setResizeMode(QHeaderView.Interactive)
tableWidget.setAlternatingRowColors(True)
tableWidget.horizontalHeader().setStretchLastSection(True)
dataList = [
["Taro", "25", "Male"],
["Hanako", "30", "Female"],
["Ichiro", "50", "Male"],
["Jiro", "40", "Male"]
]
tableWidget.setRowCount(len(dataList))
for row, colData in enumerate(dataList):
for col, value in enumerate(colData):
item = QTableWidgetItem(value)
tableWidget.setItem(row, col, item)
return tableWidget
def _makeTreeWidget(self):
"""
QTreeWidgetを作成する関数
"""
treeWidget = QTreeWidget()
headerLabels = ["Name", "Age"]
treeWidget.setColumnCount(len(headerLabels))
treeWidget.setHeaderLabels(headerLabels)
treeWidget.setAlternatingRowColors(True)
treeData = {
"Male":[
{"name":"Taro", "age":"25"},
{"name":"Ichiro", "age":"50"},
{"name":"Jiro", "age":"40"}
],
"Female":[
{"name":"Hanako", "age":"30"}
]
}
for sex, profiles in treeData.items():
topItem = QTreeWidgetItem([sex])
treeWidget.addTopLevelItem(topItem)
for profile in profiles:
childItem = QTreeWidgetItem(topItem, [profile.get("name"), profile.get("age")])
treeWidget.expandAll()
return treeWidget
def _showColorDialog(self):
"""
QColorDialog表示スロット
"""
colorDialog = QColorDialog(self)
response = colorDialog.exec_()
if response != QDialog.Accepted:
return
chosen = colorDialog.currentColor()
print("Selected color >> (%d, %d, %d)" % (chosen.red(), chosen.green(), chosen.blue()))
def _showProgressDialog(self):
"""
QProgressDialog表示スロット
"""
max = 100
progressDialog = QProgressDialog("Progress...", "Cancel", 0, max, self)
progressDialog.setWindowTitle("Progress Dialog")
for count in range(max+1):
self.qApp.processEvents()
if progressDialog.wasCanceled():
break
progressDialog.setValue(count)
progressDialog.setLabelText("Progress... %d %%" % count)
time.sleep(0.1)
def _showErrorDialog(self):
"""
QErrorMessage表示スロット
"""
self.errorDialog.showMessage("This is error message.")
def _showInputTextDialog(self):
"""
QInputDialog表示スロット(文字列入力型)
"""
response = QInputDialog.getText(self,
"Input Text",
"Input text here.")
print(response)
def _showInputComboDialog(self):
"""
QInputDialog表示スロット(アイテム選択型)
"""
response = QInputDialog.getItem(self,
"Select Item",
"Select item from the combo box.",
["item1", "item2", "item3", "item4"],
editable=False)
print(response)
def _showCustomDialog(self):
"""
MyDialog表示スロット
"""
dialog = MyDialog()
response = dialog.exec_()
if response == QDialog.Accepted:
print(dialog.getInputText())
def start(app):
maya_win = get_maya_pointer()
ui = DF_TalkUI(parent = maya_win)
ui.myInit(app)
ui.show()
return ui
if __name__ == '__main__':
app = QApplication.instance()
if app is None:
app = QApplication([])
ui = start(app)
app.exec_()