반응형

 

아래와 같이 .ui 파일을 Designer.exe 로 열어서 코드를 보려는데 에러가 나면 아래와 같이 해결한다.

 

1. C:\Users\<내User명>\AppData\Roaming\Python\Python37\Scripts 경로에 들어간다.

 

 

2. pyside6-uic.exe 파일을 찾는다.

 

반응형

 

3. 해당 파일을 복사해서 에러메세지의 경로에 이름을 바꿔서 넣어준다.

    하지만 PySide6 폴더까지왔을 때 bin 파일이 없다. 이를 내가 생성한다.

 

4. 그리고 bin 폴더 아래 아까 복사한 .exe 파일을 넣고 이름을 uic로 바꿔준다.

 

5. 이제 내 파이썬 코드를 불러오는 것을 확인할 수 있다.

 

반응형

'파이썬(python) > pySide6 (Py QT)' 카테고리의 다른 글

[PySide6] PyQT 기본 Ui 만들기  (0) 2024.11.05
반응형

 

pyside6 설치를 위한 명령어.

pip install pyside6

 

 

설치하면 아래 경로에 pyside6-designer.exe 파일이 있음. (아래는 버전이 3.11이라서 폴더명이 311임)

C:\Users\<유저이름>\AppData\Local\Programs\Python\Python311\Scripts

이를 실행하여 Ui를 쉽게 배치 가능

 

 

1. 배경만들기.

  1-1. Label 땡겨오고 text 삭제.

  1-2. 크기 키움.

  1-3. 마우스우클릭 - StyleSheet바꾸기

    1-4. 입력하기 : background-color:white;     (흰바탕이 됨)

 

 

 

2. 텍스트 상자 넣기

 

3. 버튼 넣기

 

4. 텍스트 입력상자 넣기 (1줄짜리)

    입력상자 내부에 텍스트 넣기. (우측의 속성을 활용)

 

5. 파이썬 코드 저장

 

6. ui 파일 저장.

 

 

 

반응형
반응형

 

1. 원하는 github 사이트에서 URL 가져오기. 복사한다. (이때 HTTPS로 설정하기!)

 

 

2. VScode에서 아래와 같이 클릭

 

 

 

3. Git 설치 및 다운로드

 

    default 옵션으로 모두 설치 후 VScode를 껐다가 켠다.

 

반응형

 

4. 리포지토리 복제 클릭 후 링크 붙여넣기

 

5. 레포를 관리할 경로를 선택

 

 

6. 폴더를 열어서 확인하면 복사하여 그곳에 생성된것을 확인할 수 있다.

 

 

 

반응형
반응형

 

아래 코드는 차트의 아래 부분을 변경함. (x축 값)

 

해당 값을 엑셀로 확인하는 방법.

 

 

반응형

 

코드

import openpyxl
from openpyxl.chart import Reference, BarChart, LineChart
from openpyxl.chart.data_source import AxDataSource, NumRef, StrRef
from openpyxl.chart.axis import ChartLines

path = 'C:\\temp\\test.xlsx'

# 차트를 읽는 함수 (bar와 line이 섞여 있는 차트의 경우)
def read_composite_chart(chart):
    bar_chart = None
    line_chart = None
    for ch in chart._charts:
        if isinstance(ch, BarChart):
            bar_chart = ch
        elif isinstance(ch, LineChart):
            line_chart = ch
    return bar_chart, line_chart

# 차트의 x축값, 카테고리를 출력
def print_chart_categories(chart):
    # Access all chart types within the composite chart
    bar_chart, line_chart = read_composite_chart(chart)

    # Print Bar Chart categories
    if bar_chart and bar_chart.series[0].cat:
        print("Bar Chart Categories:")
        for label in bar_chart.series[0].cat.strRef.strCache.pt:
            # 사용할 수 있는 변수 확인 idx, v
            print(vars(label)) 
            
            # 확인한 변수를 가지고 출력
            print(label.idx)
            print(label.v)

    # Print Line Chart categories
    # if line_chart and line_chart.series[0].cat:
    #     print("Line Chart Categories:")
    #     for label in line_chart.series[0].cat.strRef.strCache.pt:
    #         print(label.v)


# 차트의 카테고리 범위 변경.
def update_chart_categories(chart, sheet, new_range):
    # Access all chart types within the composite chart
    bar_chart, line_chart = read_composite_chart(chart)

    # Update Bar Chart categories
    if bar_chart:
        bar_chart.series[0].cat = AxDataSource(strRef=StrRef(f=new_range))
        print("Bar Chart categories updated.")

    # Update Line Chart categories
    if line_chart:
        line_chart.series[0].cat = AxDataSource(strRef=StrRef(f=new_range))
        print("Line Chart categories updated.")


# 엑셀 파일 열기
wb = openpyxl.load_workbook(path)
sheet = wb['sheet1']  # 원하는 시트 이름으로 변경


# 차트 객체 가져오기 (첫 번째 차트로 가정)
chart = sheet._charts[0]

# 새로운 카테고리 범위 설정 (예: C18:C30)
# 엑셀에서 해당 범위 드레그로 확인해서 복붙하는게 좋음.
new_range = "'Sheet1'!$C$18:$C$20"
update_chart_categories(chart, sheet, new_range)


wb.save(path)
# 엑셀 파일 닫기
wb.close()

 

 

 

 

 

반응형
반응형

 

엑셀의 차트의 카테코리 정보를 출력.

아래와 같이 data가 아닌, categories를 출력하는 코드.

결과

 

반응형

 

코드

import openpyxl
from openpyxl.chart import Reference, BarChart, LineChart

def read_composite_chart(chart):
    bar_chart = None
    line_chart = None

    for ch in chart._charts:
        if isinstance(ch, BarChart):
            bar_chart = ch
        elif isinstance(ch, LineChart):
            line_chart = ch

    return bar_chart, line_chart

def print_chart_series_and_categories(chart):
    # Access all chart types within the composite chart
    bar_chart, line_chart = read_composite_chart(chart)

    # Print Bar Chart series titles and categories
    if bar_chart:
        print("Bar Chart Series Titles:")
        for i, series in enumerate(bar_chart.series):
            barTitle = series.tx.v if series.tx and series.tx.v else series.title
            bar_val_ref = series.val.numRef.f if series.val and series.val.numRef else None
            print(f"title: {barTitle}")
            print(f"Bar Chart Series Values Reference: {bar_val_ref}")

        # Print Bar Chart categories
        if bar_chart.series[0].cat:
            print("Bar Chart Categories:")
            for label in bar_chart.series[0].cat.strRef.strCache.pt:
                print(label.v)

    # Print Line Chart series titles and categories
    if line_chart:
        print("Line Chart Series Titles:")
        for i, series in enumerate(line_chart.series):
            lineTitle = series.tx.v if series.tx and series.tx.v else series.title
            line_val_ref = series.val.numRef.f if series.val and series.val.numRef else None
            print(f"title: {lineTitle}")
            print(f"Line Chart Series Values Reference: {line_val_ref}")

        # Print Line Chart categories
        if line_chart.series[0].cat:
            print("Line Chart Categories:")
            for label in line_chart.series[0].cat.strRef.strCache.pt:
                print(label.v)

# 엑셀 파일 열기
wb = openpyxl.load_workbook('C:\\temp\\test.xlsx')
sheet = wb['Sheet1']  # 원하는 시트 이름으로 변경


# 차트 객체 가져오기 (첫 번째 차트로 가정)
chart = sheet._charts[0]

# 시리즈 와 카테고리 출력
print_chart_series_and_categories(chart)

# 엑셀 파일 닫기
wb.close()

 

 

 

 

 

반응형
반응형

 

 

만약 기존의 엑셀에 있는 Chart 정보를 읽고 출력하는 방법은 아래를 참고.

https://ansan-survivor.tistory.com/1980

 

[Python] 엑셀의 Chart 읽고 Series (legend)의 제목과 range값 출력

결과아래와 같은 그래프가 있을 때 결과가 잘 출력된다.  코드import openpyxlfrom openpyxl.chart import Reference, BarChart, LineChart# bar와 line이 합쳐진 복합 차트.def read_composite_chart(chart): bar_chart = None line_char

ansan-survivor.tistory.com

 

 

아래 코드

import openpyxl
from openpyxl.chart import Reference, BarChart, LineChart, Series
from copy import deepcopy

# 로드 후 결과를 다시 저장할 경로.
DEST_PATH = r"C:\Temp\test.xlsx"

# Bar와 Line형태의 차트를 읽기
def read_composite_chart(chart):
    bar_chart = None
    line_chart = None

    for ch in chart._charts:
        if isinstance(ch, BarChart):
            bar_chart = ch
        elif isinstance(ch, LineChart):
            line_chart = ch
    return bar_chart, line_chart

# 차트의 정보 출력
def print_chart_series(chart):
    # 차트 객체의 모든 차트 유형 접근
    bar_chart, line_chart = read_composite_chart(chart)

    # 바 차트 시리즈의 제목 출력
    if bar_chart:
        print("Bar Chart Series Titles:")
        for i, series in enumerate(bar_chart.series):
            barTitle = series.tx.v if series.tx and series.tx.v else series.title
            bar_val_ref = series.val.numRef.f if series.val and series.val.numRef else None
            print(f"title: {barTitle}")
            print(f"Bar Chart Series Values Reference: {bar_val_ref}")

    # 라인 차트 시리즈의 제목 출력
    if line_chart:
        print("Line Chart Series Titles:")
        for i, series in enumerate(line_chart.series):
            lineTitle = series.tx.v if series.tx and series.tx.v else series.title
            line_val_ref = series.val.numRef.f if series.val and series.val.numRef else None
            print(f"title: {lineTitle}")
            print(f"Line Chart Series Values Reference: {line_val_ref}")


# 접근한 차트의 Series의 Range 정보를 변경
def modify_chart_series_ranges(chart, new_bar_range, new_line_range):
    bar_chart, line_chart = read_composite_chart(chart)

    if bar_chart:
        for i, series in enumerate(bar_chart.series):
            series.val.numRef.f = new_bar_range
            print(f"Updated Bar Chart Series {i+1} to range: {new_bar_range}")

    if line_chart:
        for i, series in enumerate(line_chart.series):
            series.val.numRef.f = new_line_range
            print(f"Updated Line Chart Series {i+1} to range: {new_line_range}")


# 엑셀 파일 열기
wb = openpyxl.load_workbook(DEST_PATH)
sheet = wb['Shee1']  # 원하는 시트 이름으로 변경


# 차트 객체 가져오기 (첫 번째 차트로 가정)
chart = sheet._charts[0]

# 시리즈 제목 출력
print_chart_series(chart)

# 새로운 Range 설정
new_bar_range = "'Shee1'!$M$18:$M$50"
new_line_range = "'Shee1'!$N$18:$N$50"


# 시리즈의 범위 변경
modify_chart_series_ranges(chart, new_bar_range, new_line_range)


# 변경한 정보 저장
wb.save(DEST_PATH)
# 엑셀 파일 닫기
wb.close()

 

 

 

 

반응형
반응형

 

 

결과

아래와 같은 그래프가 있을 때 결과가 잘 출력된다.

 

 

코드

import openpyxl
from openpyxl.chart import Reference, BarChart, LineChart

# bar와 line이 합쳐진 복합 차트.
def read_composite_chart(chart):
    bar_chart = None
    line_chart = None

    for ch in chart._charts:
        if isinstance(ch, BarChart):
            bar_chart = ch
        elif isinstance(ch, LineChart):
            line_chart = ch

    return bar_chart, line_chart

def print_chart_series(chart):
    # 차트 객체의 모든 차트 유형 접근
    bar_chart, line_chart = read_composite_chart(chart)

    # 바 차트 시리즈의 제목 출력
    if bar_chart:
        print("Bar Chart Series Titles:")
        for i, series in enumerate(bar_chart.series):
            barTitle = series.tx.v if series.tx and series.tx.v else series.title
            bar_val_ref = series.val.numRef.f if series.val and series.val.numRef else None
            print(f"title: {barTitle}")
            print(f"Bar Chart Series Values Reference: {bar_val_ref}")

    # 라인 차트 시리즈의 제목 출력
    if line_chart:
        print("Line Chart Series Titles:")
        for i, series in enumerate(line_chart.series):
            lineTitle = series.tx.v if series.tx and series.tx.v else series.title
            line_val_ref = series.val.numRef.f if series.val and series.val.numRef else None
            print(f"title: {lineTitle}")
            print(f"Line Chart Series Values Reference: {line_val_ref}")

# 엑셀 파일 열기
wb = openpyxl.load_workbook('C:\\_workspace\\_SS_MX\\_LicenseUsageCheck\\Siemens_License_Report_Server_Template.xlsx')
sheet = wb['Sheet1']  # 원하는 시트 이름으로 변경

# 차트 객체 가져오기 (첫 번째 차트로 가정)
chart = sheet._charts[0]

# 시리즈 제목 출력
print_chart_series(chart)

# 엑셀 파일 닫기
wb.close()

 

읽은 차트의 Series를 수정하려면 아래를 참고.

https://ansan-survivor.tistory.com/1981

 

[Python] 엑셀 Chart Series (legend)의 range값 변경

만약 기존의 엑셀에 있는 Chart 정보를 읽고 출력하는 방법은 아래를 참고.https://ansan-survivor.tistory.com/1980 [Python] 엑셀의 Chart 읽고 Series (legend)의 제목과 range값 출력결과아래와 같은 그래프가 있을

ansan-survivor.tistory.com

 

 

 

 

반응형
반응형

 

PCB Panel 을 생성하면 이점은 아래 나와있다.

https://ansan-survivor.tistory.com/1978

 

[PCB Panel] PCB Panelizing / PCB 패널라이징 / PCB 패널 이란?

기본적으로 PCB설계가 끝나게 되면 이를 제조를 해야 하는데, 단 하나의 PCB만을 생산하는 것은 비효율적이다.따라서 규격화된 큰 판대기에 설계한 PCB data를 여러개를 넣어 제작하고 이를 나중에

ansan-survivor.tistory.com

 

 

그러면 이를 위해 효율적인 PCB Panel을 만들기 위해서는 Metal Balancing을 하여 도금박을 골구로 낭비되지 않게 자원을 효율적으로 사용해야 한다.

 

이점.

 

  1. 경제적이고 효과적인 화학 처리: 금속 밸런싱은 경제적이고 효과적인 화학 처리를 지원합니다.
  2. 얇은 내부 코어의 안정성 향상: 금속 밸런싱은 얇은 내부 코어의 안정성을 향상시키며, 구리 관련 폐기물 처리 비용을 크게 줄일 수 있습니다.
  3. 구리 도금의 균일성 보장: 외부 층을 밸런스를 맞추어 구리 도금의 균일성을 보장합니다.
  4. 제품 휘어짐 감소: 제품의 휘어짐(볼록 또는 비틀림)을 크게 감소시킵니다.

 

Copper Balancing을 아래와 같이 해야 합니다.

아래를 참고.

https://www.multi-circuit-boards.eu/en/pcb-design-aid/copper-balance.html

 

Copper balance

Copper balance A symmetric copper distribution (copper balance) on the circuit board is very important, because asymmetric copper leads to bow and twist effects. This warping of the form is caused by thermal loads in the circuit board, such as those caused

www.multi-circuit-boards.eu

 

회로 기판의 대칭 구리 분포(구리 균형)는 매우 중요합니다.

비대칭 구리는 휘어짐(Bow)과 비틀림(Twist) 효과를 유발하기 때문입니다.

 

이러한 형태의 뒤틀림은 HAL 제조 공정(열풍 레벨링)이나 나중에 조립 공정(리플로우의 열 발생, 웨이브 솔더링 등)에서 발생하는 것과 같은 회로 기판의 열 부하로 인해 발생합니다. 비대칭으로 배열된 구리 표면이 존재합니다.

**

"Bow"은 회로 기판의 네 모서리가 단일 평면에 놓이는 원통형 또는 구형 변형을 의미합니다.
"Twist" 변형은 대각선으로 발생합니다. 회로 기판의 네 모서리 중 하나는 나머지 세 모서리를 포함하는 평면 외부에 놓입니다.

 

(HAL 제조 공정이란?)

출처: https://m.blog.naver.com/hrkim5246/221297003500

 

IPC-600A(Rev. G)의 엄격한 표준에 따라 제조가 필요하다.

그러나 회로 기판 휘어짐 및 비틀림과 관련된 요소는 다양하며 기술적 특성(기판 재료의 두께 및 유형, 표면 유형 등 포함)에 따라 달라집니다.
구리 균형에 대한 다음 규칙을 준수하면 회로 기판이 구부러지거나 뒤틀리는 것을 방지하는 데 적극적으로 기여하게 됩니다.

1. "구리 쏠림"(Copper nests)가 생성되지 않도록 도체 트레이스가 보드 전체에 최대한 균일하게 분포되어 있는지 확인. 이는 각 레이어 내에서뿐만 아니라 두 개 이상의 레이어 사이의 대칭 축에도 적용됩니다.

2. 대규모 영역이 필요한 경우 대칭 반대쪽 레이어에 "구리 충전"을 통해 균형을 맞춰야 합니다. 즉, Open Area(Copper fill이 없는 영역)이 구리로 채워져 있음을 의미합니다. 이는 반대쪽 층의 구리에 대한 "Counter balance"을 형성합니다.

 

 

 

=====================================================

제조를 고려한 설계시 주의할 점.DFM설계 시 Panelization, Panelizing 주의점.

=====================================================

 

1.  회로 기판의 큰 Copper 영역은 가능하면 항상 그리드여야 합니다.

 

이는 일반적으로 레이아웃 프로그램에서 설정할 수 있습니다. 예를 들어, Eagle 프로그램에서는 그리드 영역을 "Hatch"라고 부릅니다.

물론 이는 민감한 고주파의 배선(Trace)이 없는 경우에만 가능합니다. "Grid"는 특히 단 하나의 레이어(one layer)만 있는 회로 기판의 경우 "뒤틀림" 및 "휨" 효과를 방지하는 데 큰 도움이 됩니다.

구리가 없는 영역은 ( Grid ) 구리로 채워야 합니다.

장점: Plated Through-Hole 벽의 균일성이 향상됩니다. 회로 기판의 비틀림 및 휘어짐을 방지합니다.

https://www.multi-circuit-boards.eu/en/pcb-design-aid/copper-balance.html

 

 

2. 구리가 Layer (층) 간에서도 상하대칭이 되어야 한다.

 

큰 구리 영역은 반대쪽 레이어의 "copper filling"으로 균형을 맞춰야 합니다.
또한 가능한 Copper Trace를 보드 전체에 최대한 균일하게 분포시키십시오. (고주파 설계와 관계 없다면)
다층 회로 기판(Multi layer board)의 경우 반대쪽 레이어와 Copper가 대칭하도록 "Copper Filling (구리 채우기)"을 합니다.

 

 

3. Copper foil(동박)의 두께는 상하 Layer에 대해 항상 대칭적으로 분포

회로 기판의 레이어 빌드업에서 Copper foil(동박)의 두께는 항상 대칭적으로 분포되어야 합니다. 
물론 비대칭 레이어 빌드업을 제작할 수 있지만, 변형 가능성 때문에 이러한 설계는 지양하는 것이 좋습니다.

 

반응형
반응형

 

기본적으로 PCB설계가 끝나게 되면 이를 제조를 해야 하는데, 단 하나의 PCB만을 생산하는 것은 비효율적이다.

따라서 규격화된 큰 판대기에 설계한 PCB data를 여러개를 넣어 제작하고 이를 나중에 잘라내는 가공을하여 여러개의 PCB 제품을 만든다.

 

이점.

  1. 대량 생산: 많은 보드를 제작해야 할 때, panelization은 시간과 비용을 절약해줍니다.
  2. 제품 안전성: Panelization은 조립 중 겪는 충격과 진동으로부터 PCB를 보호합니다.
  3. 속도와 효율성: Paste printing부터 부품 조립, 납땜, 테스트까지 여러 보드를 한 번에 처리하는 것이 더 빠르고 효율적입니다.
  4. 표준 패널 크기: 제조업체의 표준 처리 패널을 사용하여 보드를 제조하는 것이 더 비용 효과적인 경우가 많습니다.

 (Paste printing을 고려하지 않을 때 문제점: https://ansan-survivor.tistory.com/630 )

 

반응형

 

아래 Panelization 참고.

https://ansan-survivor.tistory.com/330

 

[PCB Editor] OrCAD/Allegro PCB Panelization 옵션 사용, OrCAD/Allegro PCB 페널/판넬 만들기 (17.4버전)

OrCAD/Allegro PCB에서 PCB보드 설계가 끝나면, 실제 제조를 위한 판넬이 만들어져야 가공이 가능하다. PCB 보드를 제작해도 1개 보드만을 위한 가공업체는 없다. 보통 최소 몇개 이상 주문시 가공 가능

ansan-survivor.tistory.com

 

 

 

 

 

반응형
반응형

Batch 파일로 현재 PC의 Network Adapter를 모두 찾아내고, 그 아래 부여된 IP주소를 출력.

여기서 IP주소는 IPv4, IPv6 를 의미.

 

 

코드

@echo off
setlocal enabledelayedexpansion

REM 임시 파일 생성
ipconfig > temp.txt

REM "Ethernet adapter" 또는 "Wireless LAN adapter"가 포함된 줄을 찾아서 임시 파일에 저장
findstr /r /c:"Ethernet adapter" /c:"Wireless LAN adapter" temp.txt > temp2.txt

REM 임시 파일에서 라인 단위로 읽으면서 어댑터 명과 IP 주소를 출력
for /f "tokens=1-2 delims=:" %%a in (temp2.txt) do (
    set "adapter=%%a"
    set "adapter=!adapter:~0,-1!"
    echo !adapter!

    REM 각 어댑터에 대한 IP 주소 출력
    for /f "tokens=2 delims=:" %%i in ('ipconfig ^| findstr /r /c:"IPv4 Address" /c:"IPv6 Address"') do (
        set "ip_address=%%i"
        set "ip_address=!ip_address: =!"
        echo IP Address: !ip_address!
    )
)

pause

 

temp1 파일

temp2 파일

 

temp2 파일에서 어댑터와 IP주소만 읽어서 출력.

결과

 

 

 

아래 코드는 한번 adapter를 보여주고 pause 후 ip 주소를 보여줌.

 

코드

@echo off
setlocal enabledelayedexpansion

REM 어댑터 이름 가져오기
for /f "tokens=1-2 delims=:" %%a in ('ipconfig ^| findstr /r /c:"Ethernet adapter" /c:"Wireless LAN adapter"') do (
    set "adapter=%%a"
    set "adapter=!adapter:~0,-1!"
    echo !adapter!
)

pause

REM IP 주소 가져오기
for /f "tokens=2 delims=:" %%a in ('ipconfig ^| findstr /r /c:"IPv4 Address"') do (
    set "ip_address=%%a"
    set "ip_address=!ip_address: =!"
    echo   !adapter!: !ip_address!
)

pause

 

결과

 

 

 

 

 

 

 

 

반응형
1234···145

+ Recent posts